SQL Server OUTPUT clause retourneert de waarden van elke rij die werd beïnvloed door een INSERT, UPDATE of DELETE statements.
De outputclausule geeft een kopie terug van de gegevens die tijdens het uitvoeren van de query in een aparte tabel kunnen worden ingevoegd.
deze clausule wordt het meest gebruikt om gegevenswijzigingen in de tabel bij te houden voor auditdoeleinden.
UITVOERCLAUSULE geeft toegang tot twee virtuele tabellen zoals hieronder aangegeven.
- ingevoegd die de nieuwe rijen bevat (invoegen of bijwerken)
- verwijderd die de oude kopie van de rijen bevat (leeg voor invoegen)
De uitvoerclausule heeft toegang tot alle kolommen in de tabel, zelfs als deze geen deel uitmaken van het statement invoegen .
syntaxis
---- 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)
met behulp van Output clausule met Insert statement
om output clausule resultaat in een tabel in te voegen , declareer eerst een tabel variabele om het resultaat van de output clausule op te slaan ,en gebruik de output caluse syntaxis om het resultaat op te slaan in tabel variabele .
om toegang te krijgen tot ingevoegde records, gebruikt de Uitvoerclausule ingevoegde virtuele tabel die de nieuwe rijen bevat.
In de volgende verklaring, we voegen een record in de tabel Item en gebruik de output-component voor het opslaan van records in een tabel variabele @insert_log zoals hieronder
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 ;
Zoals je kan zien in de output van de Item-tabel en de tabel variabele, Bij het invoegen van nieuwe records in de tabel item, de item-id is geen onderdeel van de insert-instructie . U kunt echter toegang krijgen tot de ItemId-kolom in de uitvoerclausule.
met behulp van Output caluse met Update Statement
voor toegang tot bijgewerkte records, kunt u ingevoegde of verwijderde virtuele tabel met output clausule gebruiken volgens uw eis.
Als u toegang wilt tot een oude waarde die was voordat de nieuwe waarde werd bijgewerkt, kunt u verwijderde virtuele tabel gebruiken en als u nieuwe bijgewerkte waarden wilt openen, kunt u ingevoegde virtuele tabel met Uitvoerclausule gebruiken.
in het volgende statement werken we ItemName waarde bij in Item tabel en gebruiken we de output clausule om de oude waarden voor die records op te slaan in een tabel variabele @update_log.
omdat we oude records willen openen, gebruiken we verwijderde virtuele tabel.
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
zoals u kunt zien, hebben we hier drie uitvoer als volgt
1: Het is de tabel-uitvoer voordat de records worden bijgewerkt.
2: Het is de tabeluitvoer na het bijwerken van de records.
3: Het is de output geretourneerd door tabel variabele die de oude records waarden bevat die vóór het bijwerken was.
Als u nieuwe records wilt openen, kunt u ingevoegde virtuele tabel gebruiken in plaats van verwijderde.
Output clausule met Delete Statement
volgende statement gebruikt delete query om de record voor ItemId= 1 uit Item tabel te verwijderen en de verwijderde records op te slaan in tabel variabele met behulp van Output caluse .
om toegang te krijgen tot verwijderde records output clausule gebruik verwijderde virtuele tabel die de oude kopie van de rijen bevat.
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
zoals u kunt zien , zijn er geen gegevens beschikbaar in Item table as it is deleted but output clause inserts that deleted records into a table variable @delete_log, which is very USY to keeping track of verwijderde records.
aanbevolen voor u
SQL Server Temporal Tables
822 totaal aantal weergaven, 8 weergaven vandaag