výstupní klauzule SQL Server vrací hodnoty každého řádku, který byl ovlivněn příkazy INSERT, UPDATE nebo DELETE.
výstupní klauzule vrací kopii dat, která mohou být vložena do samostatné tabulky během provádění dotazu.
tato klauzule se nejčastěji používá ke sledování změn dat v tabulce pro účely auditu.
výstupní klauzule umožňuje přístup ke dvěma virtuálním tabulkám, jak je uvedeno níže.
- VLOŽENÝ, který obsahuje nové řádky (INSERT nebo UPDATE)
- SMAZANÉ, která obsahuje starou kopii řádky (prázdný-li VLOŽIT)
VÝSTUPNÍ klauzule může přístup na všechny sloupce v tabulce, a to i ty, které nejsou součástí Insert .
syntaxe
---- 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)
Použití Výstupní klauzule Insert
Chcete-li vložit výstupní klauzule výsledek do tabulky , Nejprve deklarovat tabulka proměnné pro uložení výsledku z výstupní klauzuli ,a použít výstup caluse syntaxi uložit výsledek do proměnné tabulka .
pro přístup k vloženým záznamům používá výstupní klauzule vloženou virtuální tabulku obsahující nové řádky.
následující prohlášení, jsme-li vložit jeden záznam v Položce tabulky a využít výstupní klauzule pro uložení těchto záznamů do tabulky proměnné @insert_log, jak je uvedeno níže.
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 ;
Jak můžete vidět výstup Položku tabulka a tabulka proměnných, Při vkládání nových záznamů do položky tabulky, ItemId není součástí insert . Ve výstupní klauzuli však můžete přistupovat ke sloupci ItemId.
Použití Výstupní caluse s Aktualizací Prohlášení
Pro přístup k aktualizované záznamy, můžete použít buď vložené nebo odstraněné virtuální tabulka s výstupní klauzuli, dle vašeho požadavku.
Chcete-li získat přístup ke starým hodnotám, které byly před aktualizací nové hodnoty, můžete použít odstraněnou virtuální tabulku a pokud chcete získat přístup k novým aktualizovaným hodnotám, můžete použít vloženou virtuální tabulku s klauzulí výstup.
následující prohlášení, budeme aktualizovat ItemName hodnota v Položce tabulky a využít výstupní klauzule ukládat staré hodnoty pro tyto záznamy do tabulky proměnné @update_log.
protože chceme přistupovat ke starým záznamům, používáme odstraněnou virtuální tabulku.
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
Jak můžete vidět, zde máme tři výstupní takto
1: To je tabulka, výstup před aktualizací záznamů.
2: Jedná se o výstup tabulky po aktualizaci záznamů.
3: je to výstup vrácený proměnnou tabulky, která obsahuje staré hodnoty záznamů, které byly před aktualizací.
Chcete-li získat přístup k novým záznamům, můžete místo odstraněných použít vloženou virtuální tabulku.
Výstupní klauzule s Delete
Následující prohlášení používá smazat dotaz smazat záznam pro ItemId= 1 z Položky tabulky a ukládat smazané záznamy do tabulka proměnné pomocí Výstupní caluse .
pro přístup k odstraněným záznamům použijte odstraněnou virtuální tabulku, která obsahuje starou kopii řádků.
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
Jak můžete vidět , Tam je žádné údaje k dispozici v Položce tabulky, jak je to smazané, ale výstupní klauzule vložky, že odstraněné záznamy do tabulky proměnné @delete_log, což je velmi užitečné pro sledování odstraněné záznamy.
Doporučeno pro vás
SQL Server temporální tabulky
822 celkem zobrazení, 8 zobrazení dnes