SQL Server OUTPUT klausul returnerar värdena för varje rad som påverkades av en infoga, uppdatera eller ta bort uttalanden.
output-satsen returnerar en kopia av data som kan infogas i en separat tabell under utförandet av frågan.
denna klausul används oftast för att hålla reda på dataändring i tabellen för revisionssyfte.
output klausul ger tillgång till två virtuella tabeller som anges nedan.
- infogad som innehåller de nya raderna (infoga eller uppdatera)
- borttagen som innehåller den gamla kopian av raderna (tom för infoga)
utgångsklausulen kan komma åt alla kolumner i tabellen, även de ingår inte i Infoga uttalande .
SYNTAX
---- 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)
använda output klausul med Infoga uttalande
för att infoga output klausul resultat i en tabell , först deklarera en tabell variabel för att lagra resultatet av output klausul ,och använda output caluse syntax för att lagra resultatet i tabell variabel .
För att komma åt infogade poster använder output clause infogad virtuell tabell som innehåller de nya raderna.
i följande uttalande sätter vi in en post i Artikeltabell och använder output-klausulen för att lagra dessa poster i en tabellvariabel @insert_log enligt nedan
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 utmatningen från objekttabellen och tabellvariabeln, medan du infogar nya poster i objekttabellen, är itemid inte en del av INSERT-satsen . Du kan dock komma åt kolumnen ItemId i utgångsklausulen.
använda Output caluse med Update Statement
för att komma åt uppdaterade poster kan du använda antingen infogad eller borttagen virtuell tabell med output-klausul enligt ditt krav.
Om du vill komma åt ett gammalt värde som var innan du uppdaterade det nya värdet kan du använda borttagen virtuell tabell och om du vill komma åt nya uppdaterade värden kan du använda infogad virtuell tabell med output-klausul.
i följande uttalande uppdaterar vi ItemName-värdet i Artikeltabell och använder output-klausulen för att lagra de gamla värdena för dessa poster i en tabellvariabel @update_log.
eftersom vi vill komma åt gamla poster så använder vi borttaget virtuellt 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, här har vi tre utgångar enligt följande
1: Det är tabellutmatningen innan du uppdaterar posterna.
2: Det är tabellutmatningen efter uppdatering av posterna.
3: Det är utdata som returneras av tabellvariabeln som innehåller de gamla posterna värden som var före uppdatering.
Om du vill komma åt nya poster kan du använda infogad virtuell tabell istället för raderad.
output klausul med Delete Statement
följande uttalande använder delete query för att radera posten för ItemId= 1 från Objekttabellen och lagra de borttagna posterna i tabellvariabel med Output caluse .
för att komma åt borttagna poster output klausul använd borttagen virtuell tabell som innehåller den gamla kopian av raderna.
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
är mycket användbart för att hålla reda på raderade poster.
rekommenderas för dig
SQL Server temporala tabeller
822 totala Visningar, 8 visningar idag