SQL Server OUTPUT clause zwraca wartości każdego wiersza, na który wpływ miały polecenia INSERT, UPDATE lub DELETE.
Klauzula Output zwraca kopię danych, które można wstawić do osobnej tabeli podczas wykonywania zapytania.
klauzula ta jest najczęściej używana do śledzenia zmian danych w tabeli dla celów audytu.
OUTPUT clause daje dostęp do dwóch wirtualnych tabel, jak podano poniżej.
- wstawione, które zawierają nowe wiersze (INSERT lub UPDATE)
- usunięte, które zawierają starą kopię wierszy (puste dla INSERT)
klauzula wyjściowa ma dostęp do wszystkich kolumn w tabeli, nawet tych, które nie są częścią instrukcji Insert .
składnia
---- 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)
używanie klauzuli Output z instrukcją Insert
aby wstawić wynik klauzuli output do tabeli , najpierw zadeklaruj zmienną table ,aby zapisać wynik klauzuli output, a następnie użyj składni output caluse, aby zapisać wynik do zmiennej table .
aby uzyskać dostęp do wstawionych rekordów, Output clause używa wstawionej tabeli wirtualnej, która zawiera nowe wiersze.
w poniższej instrukcji wstawiamy jeden rekord do Item table i używamy klauzuli output do przechowywania tych rekordów w zmiennej tabelkowej @insert_log, jak podano poniżej
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 widać wyjście item Table i zmiennej table, podczas wstawiania nowych rekordów do item table, Itemid nie jest częścią instrukcji INSERT . Możesz jednak uzyskać dostęp do kolumny ItemId w klauzuli OUTPUT.
używając Output caluse z instrukcją Update
aby uzyskać dostęp do zaktualizowanych rekordów, możesz użyć wstawionej lub usuniętej tabeli wirtualnej z klauzulą output zgodnie z wymaganiami.
Jeśli chcesz uzyskać dostęp do starych wartości, które były przed aktualizacją nowej wartości, możesz użyć usuniętej tabeli wirtualnej, a jeśli chcesz uzyskać dostęp do nowych zaktualizowanych wartości, możesz użyć wstawionej tabeli wirtualnej z klauzulą Output.
w następującej instrukcji, aktualizujemy wartość ItemName w Item table i używamy klauzuli output do przechowywania starych wartości dla tych rekordów do zmiennej tabelarycznej @update_log.
ponieważ chcemy uzyskać dostęp do starych rekordów, używamy usuniętej wirtualnej tabeli.
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 widać, tutaj mamy trzy wyjścia w następujący sposób
1: jest to wyjście tabeli przed aktualizacją rekordów.
2: jest to wyjście tabeli po aktualizacji rekordów.
3: jest to wyjście zwracane przez zmienną tabelkową, która przechowuje stare wartości rekordów, które były przed aktualizacją.
Jeśli chcesz uzyskać dostęp do nowych rekordów, możesz użyć wstawionej tabeli wirtualnej zamiast usuniętych.
Klauzula wyjściowa z instrukcją Delete
następująca instrukcja używa zapytania delete, aby usunąć rekord Itemid= 1 Z Item table i zapisać usunięte rekordy do zmiennej table przy użyciu Output caluse .
aby uzyskać dostęp do klauzuli wyjścia usuniętych rekordów, użyj usuniętej tabeli wirtualnej, która zawiera starą kopię wierszy.
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 widać , w tabeli pozycji nie ma danych, ponieważ została usunięta, ale klauzula wyjściowa wstawia, która usuwa rekordy do zmiennej tabelkowej @delete_log, która jest bardzo przydatny do śledzenia usuniętych rekordów.
polecane dla Ciebie
tabele tematyczne SQL Server
822 wszystkich odsłon, 8 wyświetleń dzisiaj