sqlskull

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.

  1. wstawione, które zawierają nowe wiersze (INSERT lub UPDATE)
  2. 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 
spójrzmy na przykład , najpierw tworzymy tabelę o nazwie Item .
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

Related Posts

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *