Heute habe ich mir die Ausgabeklausel in SQL Server 2005 angesehen, damit Sie Daten aus Änderungsanweisungen (INSERT, UPDATE, DELETE) an Tabellenvariablen zurückgeben können. Zu den nützlichen Szenarios für DML mit Ergebnissen gehören Bereinigung und Archivierung, Messaging-Anwendungen und andere Szenarios. Die Syntax dieser neuen OUTPUT-Klausel lautet:
OUTPUT <dml_select_list> INTO @table_variable
kann auf das alte/neue Bild der geänderten Zeile zugreifen, indem es auf die eingefügte und gelöschte Tabelle verweist, ähnlich wie beim Zugriff auf Trigger. Bei einer INSERT-Anweisung kann nur auf die eingefügte Tabelle zugegriffen werden. In einer DELETE-Anweisung kann nur auf gelöschte Tabellen zugegriffen werden. In der UPDATE-Anweisung können Sie auf eingefügte und gelöschte Tabellen zugreifen. Das Folgende ist ein Beispiel aus MSDN:
Nehmen Sie als Beispiel für ein Bereinigungs- und Archivierungsschema, das für DML mit Ergebnissen nützlich sein kann, an, dass Sie über eine große Orders-Tabelle verfügen und historische Daten regelmäßig bereinigen möchten. Sie möchten die gelöschten Daten auch in eine Archivtabelle namens OrdersArchive kopieren. Sie deklarieren eine Tabellenvariable mit dem Namen @DeletedOrders und geben eine Schleife ein, in der Sie historische Daten in Blöcken löschen (z. B. Bestellungen, die älter als 2003 sind). Der hier hinzugefügte Code ist die OUTPUT-Klausel, die alle Attribute aller gelöschten Zeilen in die Tabellenvariable @DeletedOrders kopiert und dann die INSERT INTO-Anweisung verwendet, um alle Zeilen in der Tabellenvariablen in die OrdersArchive-Tabelle zu kopieren:
DECLARE @DeletedOrders TABLE
(
Bestell-ID INT,
Bestelldatum DATETIME,
empidINT,
Verwalter VARCHAR(5),
qtyINT
)
WÄHREND 1=1
BEGINNEN
BEGIN ÜBERTRAG
LÖSCHEN SIE TOP(5000) AUS Bestellungen
OUTPUT gelöscht.* INTO @DeletedOrders
WO Bestelldatum < '20030101'
IN BestellungenArchiv EINFÜGEN
SELECT * FROM @DeletedOrders
COMMIT-TRAN
LÖSCHEN AUS @DeletedOrders
WENN @@rowcount < 5000
BRECHEN
ENDE
Ein weiteres Beispiel sieht wie folgt aus: Erstellen Sie eine Tabelle Employee(EmpID int Identity(1, 1) Constraint Employee_pk Primary Key, FirstName Varchar(100), LastName Varchar(100), Sex char(1), Anrede als Groß- und Kleinschreibung, wenn Geschlecht = „M“, dann „Herr“, wenn Geschlecht = „F“, dann „Frau“, sonst, Gehaltsgeld, Abzüge als Groß- und Kleinschreibung, wenn Gehalt <3000, dann 0,20 * Gehalt, wenn Gehalt zwischen 30000 und 50000 dann .26* Gehalt, wenn Gehalt zwischen 50.001 und 75.000, dann .30*Gehalt, sonst .35*Gehaltsende, DOJ-Datum/Uhrzeit-Beschränkung DOJ_DEF Standard getdate())
} Eine sehr einfache Tabelle, in der Case-Klauseln verwendet werden, um Anrede, Abzüge, Doj usw. festzulegen. Und wir können wie folgt eine weitere gespeicherte Prozedur erstellen: Erstellen Sie die Prozedur Employee_insert@Fname varchar(100),@Lname varchar(100),@sex char(1),@Salary Moneyasdeclare @empoutput table (EmpID int, FirstName varchar(100) , Nachname Varchar(100), Geschlecht char(1), Anrede char(3), Gehaltsgeld, Abzugsgeld, DOJ-Datum/Uhrzeit )in Employee(FirstName,LastName,Salary,sex)OUTPUT einfügen.* in @empoutputvalues(@Fname ,@Lname ,@Gehalt,@Geschlecht )Wählen Sie * aus @empoutput
Wenn Sie dann die gespeicherte Prozedur aufrufen, können Sie USE [MyDatabase] wie folgt verwenden
GOexec Employee_insert 'Miho','Yoshikawa','F',146000
Auf diese Weise werden während der Ausführung Daten in die Employee-Tabelle eingefügt und eine temporäre Variable empoutput definiert. Beachten Sie, dass dies in Form einer Tabelle erfolgen kann Im Formular definiert, ist es hier leicht zu erkennen, und die in die Mitarbeitertabelle eingefügten Daten werden gleichzeitig an die empoutput-Variable ausgegeben. Nachdem wir diese gespeicherte Prozedur ausgeführt haben, finden wir die folgenden Ergebnisse
EmpID, Vorname, Nachname, Geschlecht, Anrede, Gehalt, Abzüge, DOJ
7,Miho,Yoshikawa,F,Ms.,146000.00,51100.00,2006-04-09 23:16:44.920
, und Datensätze werden tatsächlich in die Mitarbeitertabelle eingefügt
die Quelle
sehen
: jackyrong BLOG