T-SQL unterstützt die OUTPUT-Klausel nach der Einführung von SQL Server 2005 und späteren Editionen. Wir können die OUTPUT-Klausel mit DML-Anweisungen (INSERT, DELETE, UPDATE) verwenden, um Informationen aus geänderten Zeilen zurückzugeben.
Wir verwenden hauptsächlich die OUTPUT-Klausel zum Überprüfen und Archivieren geänderter Zeilen. In diesem Lernprogramm werden wir die Verwendung der OUTPUT-Klausel mit verschiedenen DML-Anweisungen und Beispielen durchgehen. Zuerst erstellen wir eine Tabelle, dbo.Songs, und füllen Sie es mit einigen Daten.
IF OBJECT_ID ('dbo.Songs') IST NICHT NULL DROP TABLE dbo.Songs GO CREATE TABLE dbo.Songs (Id int CONSTRAINT PK_Songs_Id PRIMARY KEY, Name varchar (200) NOT NULL, Sänger varchar (50) NOT NULL) GO INSERT INTO dbo.Songs (Id, Name, Sänger) WERTE (1, "Ich hasse alles an dir", "Adam Gontier"); INSERT IN dbo.Songs (Id, Name, Sänger) WERTE (2, 'Dil se', 'A. R. Rahman'); INSERT in dbo.Songs (Id, Name, Sänger) WERTE (3, 'Mein Herz wird weitergehen', 'Celine Dion'); INSERT IN dbo.Songs (Id, Name, Sänger) VALUES (4, 'Maeri', 'Euphoria'); GO SELECT * von dbo.Songs GO
Eingefügte und gelöschte Tabellen in einer OUTPUT-Klausel
Eingefügte und gelöschte Tabellen sind zwei speicherresidente Tabellen, die sich innerhalb des SQL-Servers befinden und mit der OUTPUT-Klausel verwendet werden.
Wenn eine DML-Anweisung (INSERT, DELETE, UPDATE) ausgeführt wird, werden diese Tabellen gefüllt.
Die Ergebnisse der INSERT-Anweisung werden in der Inserted-Tabelle gespeichert, und die Ergebnisse der Delete-Anweisung werden in der Delete-Tabelle gespeichert. Bei einer UPDATE-Anweisung werden die gelöschten Zeilen auch in der Deleted-Tabelle gespeichert. Die neu eingefügten Zeilen in der Inserted-Tabelle als UPDATE sind nichts anderes als kombinierte Lösch- und Einfügeoperationen.
Hinweis: Eingefügte und gelöschte Tabellen können nicht direkt abgefragt werden, um festzustellen, welche Daten aktuell gespeichert sind. Sie können sie jedoch sowohl mit der OUTPUT-Klausel als auch mit den Triggern verwenden.
Die OUTPUT-Klausel mit einer Insert-Anweisung
Wenn wir eine Einfügeoperation für eine Tabelle ausführen, erhalten wir eine Nachricht, die lautet: ((n betroffene Zeilen)). Wenn wir jedoch sehen möchten, welche Datenzeilen in eine Tabelle eingefügt wurden, können wir eine OUTPUT-Klausel und verwenden eine residente eingefügte Tabelle, um die Ergebnisse auf dieselbe Weise wie eine select-Anweisung wieder auf dem Bildschirm anzuzeigen.
Lassen Sie uns einen Datensatz einfügen und verwenden Sie eine OUTPUT-Klausel, um die Ergebnisse auf dem Bildschirm zu drucken.
INSERT in dbo.Songs (Id, Name, Sänger) OUTPUT INSERTED.ID, INSERTED.name, INSERTED.Singer VALUES (5, 'AINT no grave', 'Johnny Cash'); GEHEN
Überprüfen Sie den dbo.Songs-Tisch. Eine neue Zeile wird mit id = 5 eingefügt.
wähle * aus dbo.Songs; GEHEN
Die OUTPUT-Klausel mit einer Löschanweisung
Dasselbe gilt für einen Löschvorgang. Es zeigt nur (n betroffene Zeilen). Wir können eine OUTPUT-Klausel und eine gelöschte Tabelle verwenden, um zu sehen, welche Zeilen tatsächlich aus der Tabelle gelöscht wurden.
DELETE aus dbo.Songs OUTPUT DELETED.id, DELETED.name, DELETED.singer WHERE ID = 5; GEHEN
Fragen Sie die dbo.Songs-Tabellenzeile mit der ID = 5 ab.
wähle * aus dbo.Songs; GEHEN
Die OUTPUT-Klausel mit einer Update-Anweisung
Mit einer Update-Anweisung werden nur alte Daten gelöscht und neue Daten eingefügt. Mit einer Update-Anweisung sind also beide speicherinternen Tabellen betroffen und werden sowohl gelöscht als auch eingefügt.
Hier aktualisieren wir den Namen eines Sängers, der das Lied "Dil se" mit einer ID von zwei gesungen hat.
UPDATE dbo.Songs SET Singer = 'Rahman' OUTPUT DELETED.Singer, INSERTED.Singer WHERE ID = 2; GEHEN
Sie können den Namen des alten Sängers zusammen mit dem Namen des neuen Sängers sehen.
wähle * aus dbo.Songs;
Die drei obigen Beispiele zeigen, wie eine OUTPUT-Klausel für Prüfzwecke verwendet wird. Nun werden wir sehen, wie man es zur Archivierung verwendet.
Zuvor haben wir nur die Ergebnisse einer DML-Anweisung auf dem Bildschirm gedruckt, die temporär war. Mit der OUTPUT-Klausel können Sie die Ergebnisse einer DML-Anweisung auch in einer Tabelle speichern.
Ergebnisse einer OUTPUT-Klausel in einer Tabelle speichern
Das Einfügen der Datenrückgabe aus einer OUTPUT-Klausel in eine Tabelle kann mit einer OUTPUT INTO-Klausel erfolgen. Beachten Sie, dass Sie zuerst die Zieltabelle erstellen müssen, die dieselbe Anzahl von Spalten und Datentypen haben muss, die mit der Quelltabelle übereinstimmen.
WENN OBJECT_ID ('dbo.Songs_Inserted') NICHT NULL DROP TABLE dbo.Songs_Inserted ist GO CREATE TABLE dbo.Songs_Inserted (Id int CONSTRAINT PK_Songs__Inserted_Id Primary Key, Name varchar (200) NOT NULL) dbo.Songs (Id, Name, Sänger) OUTPUT Inserted. * INTO dbo.Songs_Inserted WERTE (5, 'Duniya', 'Piyush Mishra'); GO - Ergebnis der Songs_Inserted-Tabelle und der Basistabelle. select * from dbo.Songs_Inserted; wähle * aus dbo.Songs; GEHEN
Wie die obigen Ergebnisse zeigen, werden Daten in beide Tabellen eingefügt.
Ergebnisse einer OUTPUT-Klausel in einer temporären Tabelle speichern
Dasselbe gilt für einen temporären Tisch. Erstellen Sie zuerst eine temporäre Tabelle, und fügen Sie dann die von der OUTPUT-Klausel zurückgegebenen Daten in eine temporäre Tabelle ein. Verwenden Sie dazu eine OUTPUT INTO-Klausel.
IF OBJECT_ID ('tempdb… #Songs_Deleted') IST NICHT NULL DROP TABLE dbo. # Songs_Deleted GO CREATE TABLE dbo. # Songs_Deleted (ID int, Name varchar (200) NOT NULL, Sänger varchar (50) NOT NULL) GO DELETE von dbo .Songs OUTPUT wurde gelöscht. * INTO dbo. # Songs_Deleted WHERE ID IN (4,5); GO - Ergebnis der temporären Tabelle und Basistabelle. SELECT * von dbo. # Songs_Deleted; Wählen Sie * aus dbo.Songs;
Ergebnisse einer OUTPUT-Klausel in einer Tabellenvariablen speichern
Auch für Tabellenvariablen ändert sich nichts. Deklarieren Sie eine Tabellenvariablenstruktur wie eine Quellentabelle. Vergessen Sie nicht, das gesamte Skript auf einmal auszuführen, damit die Ausgabe in eine Tabellenvariable eingefügt wird.
@Songs_Deleted deklarieren TABLE (Id int, Name varchar (200) NOT NULL, Sänger varchar (50) NOT NULL) DELETE aus dbo.Songs OUTPUT wurde gelöscht. * INTO @Songs_Deleted WHERE ID IN (1,2); - Ergebnis der Tabellenvariablen SELECT * aus @Songs_Deleted;
Durchsuchen Sie unsere SQL Server-Archivartikel, um weitere nützliche Informationen zu erhalten.