SQL Server OUTPUT clause returnerer verdiene for hver rad som ble påvirket av EN INSERT, OPPDATERE eller SLETTE setninger.
Output-klausulen returnerer en kopi av dataene som kan settes inn i et eget bord under utførelsen av spørringen.
denne klausulen brukes oftest til å holde oversikt over dataendring i tabell for revisjonsformål.
OUTPUT-klausul gir tilgang til to virtuelle tabeller som angitt nedenfor.
- SATT inn som inneholder de nye radene (SETT inn ELLER OPPDATER)
- SLETTET som inneholder den gamle kopien av radene (tom FOR INSERT)
OUTPUT-setningen kan få tilgang til alle kolonnene i tabellen, selv de som ikke er En Del av Insert-setningen .
SYNTAKS
---- for insertINSERT INTO tablename OUTPUT inserted . *INTO @output_tablenameVALUES (col_value1 ,col_value2 ,..) ---for delete DELETE FROM tablenameOUTPUT deleted.* INTO @output_tablename WHERE Condition
CREATE TABLE dbo.Item (ItemId Int identity(1,1),ItemName Varchar(20),ItemPurchasedDate Datetime)
bruke output-setningsresultat med Insert-setning
for å sette inn output-setningsresultat i en tabell , må Du først deklarere en tabellvariabel for å lagre resultatet av output-setningsdelen, og bruke output caluse-syntaksen til å lagre resultatet i tabellvariabelen .
For å få Tilgang Til Innsatte poster bruker output-setningsdelen satt inn virtuell tabell som inneholder de nye radene.
i følgende setning setter vi inn en post I Elementtabellen og bruker output-klausulen til å lagre disse postene i en tabellvariabel @insert_log som angitt nedenfor
DECLARE @insert_log TABLE(ItemId Int, ItemName Varchar(20), ItemPurchasedDate Datetime )INSERT INTO dbo.Item OUTPUT inserted.ItemId, inserted.ItemName, inserted.ItemPurchasedDateINTO @insert_logVALUES ('Item1' , Getdate()) SELECT * FROM dbo.Item;SELECT * FROM @insert_log ;
som du kan se resultatet av elementtabell og tabellvariabel, mens du setter inn nye poster i elementtabell, er itemid ikke en del av insert-setningen . Du kan imidlertid få tilgang Til itemid-kolonnen I output-klausulen.
Bruke Output caluse Med Update Statement
for å få tilgang til oppdaterte poster, kan du bruke enten satt inn eller slettet virtuell tabell med output klausul som per kravet.
hvis du vil ha tilgang til en gammel verdi som var før du oppdaterte den nye verdien, kan du bruke slettet virtuell tabell, og hvis du vil ha tilgang til nye oppdaterte verdier, kan du bruke satt inn virtuell tabell med Utdata-klausul.
i følgende setning oppdaterer Vi ItemName-verdien I Elementtabellen og bruker output-klausulen til å lagre de gamle verdiene for disse postene i en tabellvariabel @update_log.
som vi vil ha tilgang til gamle poster, bruker vi slettet virtuelt bord.
DECLARE @update_log TABLE( ItemId int, ItemName Varchar(20), ItemPurchasedDate Datetime )UPDATE dbo.Item SET ItemName ='Item2'OUTPUT deleted.ItemId, deleted.ItemName, deleted.ItemPurchasedDateINTO @update_logWHERE ItemId =1SELECT * FROM dbo.Item;SELECT * FROM @update_log
som du kan se, her har vi tre utdata som følger
1: det er tabellutgangen før du oppdaterer postene.
2: det er tabellutgangen etter oppdatering av postene.
3: det er utdataene som returneres av tabellvariabelen som inneholder de gamle postverdiene som var før oppdatering.
hvis du vil ha tilgang til nye poster, kan du bruke satt inn virtuelt bord i stedet for slettet.
output-setning Med Delete-Setning
Følgende setning bruker delete query til å slette posten For ItemId= 1 Fra Elementtabellen og lagre de slettede postene i tabellvariabelen ved Hjelp Av Output caluse .
for å få tilgang til slettede poster, bruk slettet virtuell tabell som inneholder den gamle kopien av radene.
DECLARE @delete_log TABLE( ItemId Int, ItemName Varchar(20), ItemPurchasedDate Datetime )DELETE FROM dbo.Item OUTPUT deleted.ItemId, deleted.ItemName, deleted.ItemPurchasedDateINTO @delete_logWHERE ItemId =1SELECT * FROM dbo.Item;SELECT * FROM @delete_log
er svært nyttig å holde styr på slettede poster.
Anbefalt for deg
SQL Server Temporale Tabeller
822 totalt antall visninger, 8 visninger i dag