En nybörjarguide till OUTPUT-klausulen i SQL Server

T-SQL stöder OUTPUT-klausulen efter starten av SQL Server 2005 och senare utgåvor. Vi kan använda OUTPUT-klausulen med DML-satser (INSERT, DELETE, UPDATE) för att returnera information från modifierade rader.

Vi använder främst OUTPUT-klausulen för revision och arkivering av modifierade rader. I denna handledning går vi igenom användningen av OUTPUT-klausulen med olika DML-satser och exempel. Först ska vi skapa ett bord, dbo.Songs, och fyll i den med viss data.

OM OBJECT_ID ('dbo.Songs') ÄR INTE NULL DROP TABELL dbo.Songs GÅ CREATE TABLE dbo.Songs (Id int CONSTRAINT PK_Songs_Id PRIMÄRT NYCKEL, Namn Varchar (200) INTE NULL, Sångare Varchar (50) INTE NULL) SÄKER INSERT INTO dbo.Songs (Id, Namn, Sångare) VÄRDEN (1, "Jag hatar allt om dig", "Adam Gontier"); INSERT INTO DBO.Songs (Id, Namn, Sångare) VÄRDEN (2, 'Dil se', 'A. R. Rahman'); INSERT INTO DBO.Songs (Id, Namn, Sångare) VÄRDEN (3, "Mitt hjärta kommer att gå på", "Celine Dion"); INSERT INTO DBO.Songs (Id, Namn, Sångare) VÄRDER (4, 'Maeri', 'Euphoria'); GÅ VÄLJ * från dbo.Songs GO



Infogade och borttagna tabeller i en OUTPUT-klausul

Inmatade och borttagna tabeller är två minnesboende tabeller som ligger inom SQL-servern och används med OUTPUT-klausulen.

När varje DML (INSERT, DELETE, UPDATE) uttalande exekveras, fylls dessa tabeller.

Resultaten av INSERT-förklaringen lagras i den infogade tabellen, och resultaten av raderingsrapporteringen lagras i tabellen Raderat. Också med ett UPDATE-meddelande lagras de raderade raderna i tabellen Raderat. De nya infogade raderna i den infogade tabellen som UPDATE är ingenting annat än att radera och sätta in kombinationer tillsammans.

Obs! Du kan inte direkt söka in Inserted och Deleted tabeller för att se vilka data de håller för närvarande, men du kan använda dem med OUTPUT-klausulen såväl som med Triggers.


OUTPUT-klausulen med ett insert-meddelande

När vi gör en infogningsoperation på ett bord får vi ett meddelande som läser "(n rad (er) drabbade)", men om vi vill se vilka datrader som sätts in i ett bord kan vi använda en OUTPUT-klausul och ett minnesboende inmatat bord för att returnera resultaten tillbaka till skärmen på samma sätt som ett valt uttalande gör.

Låt oss infoga en post och använd en OUTPUT-klausul för att skriva ut resultaten på skärmen.

INSERT INTO DBO.Songs (Id, Namn, Sångare) OUTPUT INSERTED.ID, INSERTED.name, INSERTED.Singer VALUES (5, 'AINT no grave', 'Johnny Cash'); GÅ


Kontrollera tabellen dbo.Songs. En ny rad infogas med id = 5.

välj * från dbo.Songs; GÅ



Utgångsklausulen med en raderingsförklaring

Detsamma gäller med en raderingsoperation. Den visar endast (n rader som berörs). Vi kan använda en OUTPUT-klausul och en raderad tabell för att se vilka rader som faktiskt raderades från tabellen.

DELETE från dbo.Songs OUTPUT DELETED.id, DELETED.name, DELETED.singer VAR ID = 5; GÅ


Fråga dboSongs tabellrad med id = 5 har raderats.

välj * från dbo.Songs; GÅ



Utgångsklausulen med en uppdatering

Ett uppdateringsutdrag gör ingenting annat än raderar gamla data och infogar nya data, så med en uppdateringsutskrift påverkas båda minnesboende tabellerna och tas bort såväl som infogade.

Här uppdaterar vi namnet på en sångare, som har sjungit "Dil se" sång, med ID lika med två.

UPDATE dbo.Songs SET Singer = 'Rahman' UTGÅNG DELETED.Singer, INSERTED.Singer WHERE ID = 2; GÅ


Du kan se den gamla sångarens namn tillsammans med den nya sångarens namn.

välj * från dbo.Songs;


De tre exemplen ovan visar hur man använder en OUTPUT-klausul för revisionsändamål. Nu ska vi se hur man använder den för arkivering.

Innan vi bara skriver ut resultaten av ett DML-påstående på skärmen, vilket var tillfälligt, men med OUTPUT-klausulen kan du också lagra resultaten av ett DML-uttalande i ett bord.


Spara resultat av en UTGÅNGKlausul i en tabell

Att sätta in dataåtergången från en OUTPUT-klausul till en tabell kan göras med hjälp av en OUTPUT INTO-klausul. Tänk på att du först behöver skapa måltabell som måste ha samma antal kolumner och datatyper som matchar källtabellen.

OM OBJECT_ID ('dbo.Songs_Inserted') ÄR INTE NULL DROP TABELL dbo.Songs_Inserted GÅ CREATE TABLE dbo.Songs_Inserted (Id int CONSTRAINT PK_Songs__Inserted_Id PRIMÄR NYCKEL, Namn Varchar (200) INTE NULL, Sångare Varchar (50) INTE NULL) SÄKER INSERT INTO dbo.Songs (Id, Namn, Sångare) OUTPUT Inserted. * INTO dbo.Songs_Inserted VALUES (5, 'Duniya', 'Piyush Mishra'); GO - Resultat av Songs_Inserted bord och basbord. välj * från dbo.Songs_Inserted; välj * från dbo.Songs; GÅ


Som resultaten ovan visar, sätts data in i båda tabellerna.


Lagra resultat av en OUTPUT-klausul i ett temporärt bord

Detsamma gäller med en tillfällig tabell. Skapa en tillfällig tabell först och använd sedan en OUTPUT INTO-klausul, sätt in data som returneras av OUTPUT-klausulen i en tillfällig tabell.

Om OBJECT_ID ('tempdb ... #Songs_Deleted') ÄR INTE NULL DROP TABLE dbo. # Songs_Deleted GÅ CREATE TABLE dbo. # Songs_Deleted (Id int, Namn varchar (200) INTE NULL, Sångare varchar (50) INTE NULL) GÅ DELETE från dbo .Songs OUTPUT tas bort. * INTO dbo. # Songs_Deleted VAR ID IN (4,5); GO - Resultat av tillfällig tabell och basbord. VÄLJ * från dbo. # Songs_Deleted; Välj * från dbo.Songs;



Spara resultat av en OUTPUT-klausul i en tabellvariabel

Inget ändras också för tabellvariabler. Förklara en tabellvariabel struktur som samma som en källtabell. Glöm inte att köra hela skriptet på en gång så att du kan se utmatningen infogad i en tabellvariabel.

Förklara @Songs_Deleted TABLE (Id int, Namn varchar (200) NOT NULL, Sångare varchar (50) NOT NULL) DELETE från dbo.Songs OUTPUT raderad. * INTO @Songs_Deleted VAR ID IN (1,2); - Resultat av tabellvariabel SELECT * från @Songs_Deleted;


Bläddra igenom våra SQL-arkivartiklar för mer användbar information.