Udostępnij za pośrednictwem


Klauzula wyjściowy (Transact-SQL)

Zwraca informacje z, lub na podstawie wyrażenia, każdy wiersz dotyczy INSERT, UPDATE, DELETE lub korespondencji seryjnej instrukcja.Te wyniki mogą być zwracane do aplikacji przetwarzającej do użycia w takich elementów, jak komunikatów potwierdzających, archiwizowanie i innych takich wymagań aplikacji.wyniki również mogą być wstawiane do tabela lub zmiennej tabela .Można ponadto przechwytywanie wyniki wyjściowych klauzula w zagnieżdżonych DELETE INSERT, UPDATE lub SCALIĆ instrukcjai włóż tych wyniki do miejsce docelowe tabela lub widoku.

Ostrzeżenie

AKTUALIZACJI, WSTAWIANIA lub usuwania instrukcja , która zawiera dane wyjściowe klauzula zwróci wierszy do klient , nawet jeśli instrukcja napotka błędy i jest przywracana.Wynik nie powinny być używane, jeśli jakiś błąd wystąpi podczas wykonywania instrukcja.

Używane w:

USUŃ

WSTAW

AKTUALIZACJA

KORESPONDENCJI SERYJNEJ

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

<OUTPUT_CLAUSE> ::=
{
    [ OUTPUT <dml_select_list> INTO { @table_variable | output_table } [ ( column_list ) ] ]
    [ OUTPUT <dml_select_list> ]
}
<dml_select_list> ::=
{ <column_name> | scalar_expression } [ [AS] column_alias_identifier ]
    [ ,...n ]

<column_name> ::=
{ DELETED | INSERTED | from_table_name } . { * | column_name }
    | $action

Argumenty

  • @table_variable
    Określa table zmienną, która zwrócone wiersze są wstawiane do zamiast zwracanych do rozmówcy.@table_variable musi być zadeklarowana przed instrukcjaINSERT, UPDATE, DELETE lub korespondencji seryjnej.

    Jeśli column_list nie jest określony, table Zmienna musi mieć taką samą liczbę kolumn jako wyjścia zestaw wyników.Wyjątkami są tożsamości i kolumny obliczane, które muszą zostać pominięte.Jeśli column_list jest określony, żadnych kolumn zostanie pominięta musi zezwolić na wartości null lub mają domyślne wartości przypisane im.

    Aby uzyskać więcej informacji o table zmiennych, zobacz Tabela (języka Transact-SQL).

  • output_table
    Określa zwrócone wiersze są wstawiane do zamiast zwróconych wywołującemu tabela .output_tablemoże być tymczasowej tabela.

    Jeśli column_list nie jest określony, tabela musi mieć taką samą liczbę kolumn jako wyjścia zestaw wyników.Wyjątkami są tożsamości i kolumny obliczane.Muszą one pominięte.Jeśli column_list jest określony, żadnych kolumn zostanie pominięta musi zezwolić na wartości null lub mają domyślne wartości przypisane im.

    output_tablenie można:

    • Włączono wyzwalaczy zdefiniowany na nim.

    • Udział po obu stronach ograniczenia na klucz OBCY.

    • Mieć ograniczenia CHECK lub włączone reguły.

  • column_list
    To opcjonalna lista nazw kolumna w miejsce docelowe tabela klauzulaINTO.Jest analogiczne do listy kolumna dozwolone w WSTAW instrukcja.

  • scalar_expression
    Jest kombinacją operatorów i symbole, którego wynikiem jest pojedyncza wartość.Funkcje agregujące nie są dozwolone w scalar_expression.

    Każde odwołanie do kolumny w tabela modyfikowany musi być kwalifikowany z prefiksem włożona lub usunięte.

  • column_alias_identifier
    Jest alternatywna nazwa używana nazwa kolumna odwołać.

  • USUNIĘTE
    Jest prefiks kolumna , która określa wartość usuwane przez aktualizację lub usunąć operacji.Kolumny prefiksem usuniętych odzwierciedlają wartości przed AKTUALIZACJĄ, usuwanie, lub Ukończono scalanie instrukcja .

    USUNIĘTYCH nie korzystać z danych wyjściowych klauzula w instrukcjaINSERT.

  • DODAJE
    Jest prefiks kolumna , która określa wartość dodana w wyniku operacji insert lub update.Kolumny prefiksem włożona odpowiada wartościom po wykonaniu instrukcja aktualizacji, WSTAWIANIA lub korespondencji seryjnej, ale przed wyzwalacze są wykonywane.

    WŁOŻONA nie korzystać z danych wyjściowych klauzula w instrukcjaDELETE.

  • from_table_name
    Jest prefiks kolumna , która określa tabela w klauzula FROM DELETE, aktualizacji lub korespondencji seryjnej instrukcja , że jest używana do określania wierszy, aby zaktualizować lub usunąć.

    Jeżeli modyfikowane w tabela podano także w FROM klauzula, wszelkie odniesienia do kolumn w tej tabela musi być kwalifikowany z prefiksem włożona lub usunięte.

  • *
    Określa, że wszystkie kolumny dotyczy delete, insert lub update akcja zostaną zwrócone w kolejności, w jakiej istnieją w tabela.

    Na przykład OUTPUT DELETED.* w następujących DELETE instrukcja zwraca wszystkie kolumny usunięte z ShoppingCartItem tabela:

    DELETE Sales.ShoppingCartItem
        OUTPUT DELETED.*;
    
  • column_name
    Jest odwołaniem jawne kolumna .Wszelkie odniesienia do tabela modyfikowany musi być poprawnie kwalifikowany włożona lub prefiks usunięte, w stosownych przypadkach, na przykład: DODAJE się**.**column_name.

  • $akcja
    Jest dostępna tylko w przypadku scalania instrukcja.Określa kolumna typu nvarchar(10) w danych wyjściowych klauzula w korespondencji seryjnej instrukcja , które zwraca jeden z trzech wartości dla każdego wiersza: "WSTAW", "Aktualizacja" lub "Usuwanie" zgodnie z akcja zostało wykonane dla tego wiersza.

Uwagi

Dane wyjściowe <dml_select_list> klauzula i dane wyjściowe <dml_select_list> INTO { **@**table_variable | output_table} klauzula można zdefiniować w pojedynczej INSERT, UPDATE, DELETE lub korespondencji seryjnej instrukcja.

Ostrzeżenie

Chyba że określono inaczej, odniesienia do wyjścia klauzula odnoszą się do wyjścia klauzula i dane wyjściowe do klauzula.

Dane wyjściowe klauzula może być przydatne do pobierania wartości tożsamości lub kolumny obliczane po operacji INSERT lub UPDATE.

Kiedy obliczanej kolumna znajduje się w <dml_select_list>, odpowiedniej kolumna w tabela wyjściowej lub zmiennej tabela nie jest kolumnaobliczana.Wartości w nowej kolumna są wartościami, które zostały obliczone w czas którego wykonano instrukcja .

Nie ma żadnej gwarancji, będą odpowiadać kolejności stosowania zmiany do tabela i kolejności, w którym wiersze są wstawiane do tabela wyników lub zmiennej tabela .

Jeśli parametry lub zmienne są modyfikowane w ramach aktualizacji instrukcja, wyjście klauzula zawsze zwraca wartość parametru lub zmiennej sprzed instrukcja wykonywana zamiast wartości zmodyfikowanej.

Za pomocą raportu za pomocą aktualizacji lub usunięcia instrukcja umieszczone na używa składni gdzie bieżący z kursor .

Dane wyjściowe klauzula nie jest obsługiwany w następujących instrukcji:

  • SprawozdaniaDML , które odwołują się do lokalnych widoków podzielonym na partycje rozproszonych widoki podzielonym na partycje lub zdalnego tabel.

  • Instrukcji INSERT, które zawierają wykonywanie instrukcja.

  • Predykaty pełnego tekstu nie są dozwolone w danych wyjściowych klauzula na zgodność bazy danych poziom jest zestaw na 100.

  • Dane wyjściowe do klauzula nie można używać do wstawiania do widoku lub zestaw wierszy funkcja.

  • Nie można utworzyć zdefiniowanej przez użytkownika funkcja , jeśli zawiera ona dane wyjściowe do klauzula zawierający tabela jako jej miejsce docelowe.

Aby zapobiec rodzaju produkcji klauzula nie może zawierać następujące informacje:

  • Podkwerend lub funkcje zdefiniowane przez użytkownika, które wykonuje system lub użytkownik dostępu do danych lub założyć przeprowadzenie takiego dostępu.Funkcje zdefiniowane przez użytkownika są uznawane za wykonywanie dostępu do danych, jeśli nie są one związanych ze schematem.

  • kolumna z widoku lub wewnętrznej tabela-wycenione funkcja podczas tej kolumna jest definiowana przez jedną z następujących metod:

    • podzapytanie.

    • Zdefiniowane przez użytkownika funkcja , która wykonuje system lub użytkownik dostępu do danych lub zakłada, że do wykonania takiego dostępu.

    • Obliczanej kolumna zawierającej zdefiniowanej przez użytkownika funkcja przeprowadzającym użytkownika lub dostępu do danych systemu jego definicję.

    Gdy SQL Server wykryje takiej kolumna w danych wyjściowych klauzulapowstaje błąd 4186.Aby uzyskać więcej informacji, zobacz MSSQLSERVER_4186.

Wstawianie danych zwróconych z klauzuli dane wyjściowe do tabeli

Podczas przechwytywania wyniki wyjściowych klauzula w WSTAW zagnieżdżone aktualizacji, usunąć, lub SCALIĆ instrukcja i wstawianie tych wyniki do miejsce docelowe tabela, pamiętać następujące informacje:

  • Cała operacja jest niepodzielny.Zarówno instrukcja INSERT i zagnieżdżonych DMLinstrukcja , która zawiera klauzuladane wyjściowewykonaćalbo cały instrukcja nie powiedzie się.

  • Do miejsce docelowe zewnętrzne instrukcjaINSERT, obowiązują następujące ograniczenia:

    • miejsce docelowe nie może być tabela zdalna, widoku lub tabelatypowewyrażenie.

    • miejsce docelowe nie może mieć ograniczenia na klucz OBCY lub odwoływać się ograniczenie na klucz OBCY.

    • Wyzwalacze nie mogą być definiowane w miejsce docelowe.

    • miejsce docelowe nie może uczestniczyć w replikacja scalająca lub aktualizowalna subskrypcji dla replikacjatransakcyjnej.

  • DMLzagnieżdżonychinstrukcjadotyczą następujące ograniczenia:

    • miejsce docelowe nie może być tabela zdalna lub widoku podzielonym na partycje.

    • źródło sam nie może zawierać <dml_table_source>klauzula.

  • Dane wyjściowe do klauzula nie jest obsługiwany w instrukcji INSERT, które zawierają <dml_table_source> klauzula.

  • @@ ROWCOUNT zwracająca wiersze wstawione tylko przez zewnętrzne instrukcjaINSERT.

  • @@ IDENTITY, SCOPE_IDENTITY i IDENT_CURRENT zwracają wartości tożsamości generowane są tylko DMLzagnieżdżonychinstrukcjai nie tych generowanych przez zewnętrzne instrukcjaINSERT.

  • Kwerendy powiadomień Traktuj jako jeden obiekt instrukcja i typu żadnego komunikatu, który jest tworzony będzie typu zagnieżdżonego DML, nawet jeśli znacząca zmiana zewnętrznego WSTAW instrukcja , sam.

  • W <dml_table_source> klauzulaSELECT i gdzie nie może zawierać klauzule podkwerendy, funkcji wartość zagregowana , funkcji klasyfikacji, predykatów pełnego tekstu, funkcji zdefiniowanej przez użytkownika, wykonujących dostępu do danych lub TEXTPTR funkcja.

Wyzwalacze

Kolumny zwracane z produkcji odzwierciedlające dane jest po INSERT, UPDATE lub DELETE instrukcja została ukończona, ale przed wyzwalacze są wykonywane.

Aby zamiast wyzwalaczy, generowane są zwracane wyniki , tak jakby INSERT, UPDATE lub DELETE faktycznie miał miejsce, nawet jeśli żadne z modyfikacji, mają miejsce w wyniku operacji wyzwalacza.Użycie instrukcja , zawierający dane wyjściowe klauzula wewnątrz ciała wyzwalacz aliasów tabela należy używać do odwoływania wyzwalacz inserted i deleted tabele, aby uniknąć duplikowania odwołania do kolumna z tabel włożona i usunięte skojarzone z danych wyjściowych.

Jeśli dane wyjściowe klauzula jest określona bez określenia również słowa kluczowego INTO, miejsce docelowe operacji DML nie może mieć żadnych włączonych wyzwalacza zdefiniowane na nim DMLdanejakcja. Na przykład w danych wyjściowych klauzula jest zdefiniowana w aktualizacji instrukcja, miejsce docelowe tabela nie może mieć żadnych włączonych wyzwalaczy aktualizacji.

Jeśli sp_configure opcji disallow results from triggers jest zestaw, dane wyjściowe klauzula bez INTO klauzula powoduje, że instrukcja kończy się niepowodzeniem, jeśli zostanie wywołane z wyzwalaczem.

Typy danych

Dane wyjściowe klauzula obsługuje typy danych dużego obiektu: nvarchar(max), varchar(max), varbinary(max), text, ntext, image, and xml.Kiedy używać.ZAPIS klauzula w aktualizacji instrukcja do modyfikowania nvarchar(max), varchar(max), lub varbinary(max) kolumnapełnej przed i po obrazy wartości są zwracane, jeśli są wywoływane.TEXTPTR () funkcja nie są wyświetlane jako część wyrażenie na text, ntext, lub image kolumna w danych wyjściowych klauzula.

Kolejki

Dane wyjściowe można używać w aplikacji korzystających z tabel jako kolejek lub do przechowywania wyników pośrednich ustawia.Oznacza to, że aplikacja jest stale Dodawanie lub usuwanie wierszy z tabela.W poniższym przykładzie użyto wyjścia klauzula w instrukcja DELETE, aby przywrócić usunięty wiersz do aplikacji wywołującej.

USE AdventureWorks2008R2;
GO
DELETE TOP(1) dbo.DatabaseLog WITH (READPAST)
OUTPUT deleted.*
WHERE DatabaseLogID = 7;
GO

W tym przykładzie powoduje usunięcie wiersza z tabela używana jako kolejka i zwraca usunięto wartości do aplikacji przetwarzającej w jednej akcja.Inne semantyka może także być wprowadzane w życie takich jak użycie tabela do realizacji stosu.Jednakże SQL Server nie gwarantuje kolejności przetwarzane i zwracane przez DML instrukcji przy użyciu danych wyjściowych klauzulawierszy.Jest do aplikacji, aby uwzględnić odpowiednie WHERE klauzula , można zagwarantować odpowiedni semantykalub zrozumieć, gdy wiele wierszy mogą kwalifikować się do operacji DML , jest gwarantowane zamówienia.Poniższy przykład używa podzapytanie i przyjmuje unikatowości jest charakterystyczne dla DatabaseLogID kolumna do wykonania żądanej zamawiania semantyka.

USE tempdb;
GO

CREATE TABLE dbo.table1
(
    id INT,
    employee VARCHAR(32)
)
go

INSERT INTO dbo.table1 VALUES 
      (1, 'Fred')
     ,(2, 'Tom')
     ,(3, 'Sally')
     ,(4, 'Alice');
GO

DECLARE @MyTableVar TABLE
(
    id INT,
    employee VARCHAR(32)
);

PRINT 'table1, before delete' 
SELECT * FROM dbo.table1;

DELETE FROM dbo.table1
OUTPUT DELETED.* INTO @MyTableVar
WHERE id = 4 OR id = 2;

PRINT 'table1, after delete'
SELECT * FROM dbo.table1;

PRINT '@MyTableVar, after delete'
SELECT * FROM @MyTableVar;

DROP TABLE dbo.table1;

--Results
--table1, before delete
--id          employee
------------- ------------------------------
--1           Fred
--2           Tom
--3           Sally
--4           Alice
--
--table1, after delete
--id          employee
------------- ------------------------------
--1           Fred
--3           Sally
--@MyTableVar, after delete
--id          employee
------------- ------------------------------
--2           Tom
--4           Alice

Ostrzeżenie

Użyć wskazówki tabela READPAST w instrukcjach UPDATE i DELETE, jeśli danego scenariusza umożliwia wielu aplikacji wykonywanie destrukcyjnych odczytu z jednej tabela.Zapobiega to blokowanie problemy, które mogą pochodzić w górę, jeśli inna aplikacja jest już czytania pierwszego kwalifikujących się rejestrować w tabela.

Uprawnienia

Wybierz uprawnienia są wymagane w dowolnej kolumny pobierane za pośrednictwem <dml_select_list> lub używanych w <scalar_expression>.

WSTAW uprawnienia są wymagane na wszystkie tabele określone w <output_table>.

Przykłady

A.Przy użyciu danych wyjściowych do prostej instrukcjaINSERT

Poniższy przykład ilustruje wstawienie wiersza do ScrapReason tabela i zastosowań OUTPUT klauzula można zwrócić wyniki instrukcja , aby @MyTableVartable zmiennej.Ponieważ ScrapReasonID kolumna jest zdefiniowana z tożsamości właściwość, wartość nie zostanie określona w INSERT instrukcja dla tej kolumna.Należy jednak zauważyć, że wartość generowana przez Aparat baz danych dla tej kolumna jest zwracany w OUTPUT klauzula w kolumna inserted.ScrapReasonID.

USE AdventureWorks2008R2;
GO
DECLARE @MyTableVar table( NewScrapReasonID smallint,
                           Name varchar(50),
                           ModifiedDate datetime);
INSERT Production.ScrapReason
    OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
        INTO @MyTableVar
VALUES (N'Operator error', GETDATE());

--Display the result set of the table variable.
SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate 
FROM Production.ScrapReason;
GO

B.Dane wyjściowe przy użyciu instrukcjaDELETE

W następującym przykładzie usunięto wszystkie wiersze w ShoppingCartItem tabela.klauzulaOUTPUT DELETED.* Określa, że wyniki DELETEinstrukcja, to wszystkie kolumny usunięte wiersze zwracane do aplikacji wywołującej. SELECTinstrukcja następuje weryfikuje wyniki operacji usuwania na ShoppingCartItemtabela.

USE AdventureWorks2008R2;
GO
DELETE Sales.ShoppingCartItem
OUTPUT DELETED.* 
WHERE ShoppingCartID = 20621;

--Verify the rows in the table matching the WHERE clause have been deleted.
SELECT COUNT(*) AS [Rows in Table] FROM Sales.ShoppingCartItem WHERE ShoppingCartID = 20621;
GO

C.Przy użyciu danych wyjściowych do aktualizacji instrukcja

Następujące aktualizacje przykład VacationHours kolumna w Employee tabela o 25 procent dla pierwszych 10 wierszy.Ustawia również wartość kolumna ModifiedDate do bieżącej data.OUTPUTZwracaklauzula VacationHours wartość, która istnieje przed zastosowaniem UPDATEinstrukcja w kolumna deleted.VacationHours, a zaktualizowana wartość w kolumna inserted.VacationHours do @MyTableVartable zmiennej.

Dwa SELECT Wykonaj instrukcje, które zwracają wartości w @MyTableVar i wyniki operacji aktualizacji w Employee tabela.

USE AdventureWorks2008R2;
GO
DECLARE @MyTableVar table(
    EmpID int NOT NULL,
    OldVacationHours int,
    NewVacationHours int,
    ModifiedDate datetime);
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25,
    ModifiedDate = GETDATE() 
OUTPUT inserted.BusinessEntityID,
       deleted.VacationHours,
       inserted.VacationHours,
       inserted.ModifiedDate
INTO @MyTableVar;
--Display the result set of the table variable.
SELECT EmpID, OldVacationHours, NewVacationHours, ModifiedDate
FROM @MyTableVar;
GO
--Display the result set of the table.
SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDate
FROM HumanResources.Employee;
GO

D.Korzystanie z danych wyjściowych do zwraca wyrażenie

Poniższy przykład tworzy na przykład c przez definiowanie wyrażenie w OUTPUT klauzula jako różnica między zaktualizowanego VacationHours wartość i VacationHours wartości sprzed zastosowania aktualizacji.Zwracana wartość wyrażenie do @MyTableVartable zmienną w kolumna VacationHoursDifference.

USE AdventureWorks2008R2;
GO
DECLARE @MyTableVar table(
    EmpID int NOT NULL,
    OldVacationHours int,
    NewVacationHours int,
    VacationHoursDifference int,
    ModifiedDate datetime);
UPDATE TOP (10) HumanResources.Employee
SET VacationHours = VacationHours * 1.25,
    ModifiedDate = GETDATE()
OUTPUT inserted.BusinessEntityID,
       deleted.VacationHours,
       inserted.VacationHours,
       inserted.VacationHours - deleted.VacationHours,
       inserted.ModifiedDate
INTO @MyTableVar;
--Display the result set of the table variable.
SELECT EmpID, OldVacationHours, NewVacationHours, 
    VacationHoursDifference, ModifiedDate
FROM @MyTableVar;
GO
SELECT TOP (10) BusinessEntityID, VacationHours, ModifiedDate
FROM HumanResources.Employee;
GO

E.Przy użyciu danych wyjściowych do from_table_name w aktualizacji instrukcja

Następujące aktualizacje przykład ScrapReasonID kolumna w WorkOrder tabela dla wszystkich zleceń roboczych z określonym ProductID i ScrapReasonID.OUTPUT INTOklauzula zwraca wartości z tabela aktualizowane ( WorkOrder) i również z Producttabela. Producttabela jest używana w FROMklauzula do określania wierszy do aktualizacji. Ponieważ WorkOrder tabela ma AFTER UPDATE wyzwalacz zdefiniowane, INTO słowo kluczowe jest wymagana.

USE AdventureWorks2008R2;
GO
DECLARE @MyTestVar table (
    OldScrapReasonID int NOT NULL, 
    NewScrapReasonID int NOT NULL, 
    WorkOrderID int NOT NULL,
    ProductID int NOT NULL,
    ProductName nvarchar(50)NOT NULL);
UPDATE Production.WorkOrder
SET ScrapReasonID = 4
OUTPUT deleted.ScrapReasonID,
       inserted.ScrapReasonID, 
       inserted.WorkOrderID,
       inserted.ProductID,
       p.Name
    INTO @MyTestVar
FROM Production.WorkOrder AS wo
    INNER JOIN Production.Product AS p 
    ON wo.ProductID = p.ProductID 
    AND wo.ScrapReasonID= 16
    AND p.ProductID = 733;
SELECT OldScrapReasonID, NewScrapReasonID, WorkOrderID, 
    ProductID, ProductName 
FROM @MyTestVar;
GO

F.Przy użyciu danych wyjściowych do from_table_name w instrukcjaDELETE

W następującym przykładzie usunięto wiersze w ProductProductPhoto tabela na podstawie kryteriów wyszukiwania określonych w FROM klauzula DELETE instrukcja.OUTPUTklauzula zwraca kolumny z tabela zostanie usunięty ( deleted.ProductID, deleted.ProductPhotoID) i kolumny z Producttabela. Ta tabela jest używana w FROM klauzula do określania wierszy do usunięcia.

USE AdventureWorks2008R2;
GO
DECLARE @MyTableVar table (
    ProductID int NOT NULL, 
    ProductName nvarchar(50)NOT NULL,
    ProductModelID int NOT NULL, 
    PhotoID int NOT NULL);

DELETE Production.ProductProductPhoto
OUTPUT DELETED.ProductID,
       p.Name,
       p.ProductModelID,
       DELETED.ProductPhotoID
    INTO @MyTableVar
FROM Production.ProductProductPhoto AS ph
JOIN Production.Product as p 
    ON ph.ProductID = p.ProductID 
    WHERE p.ProductModelID BETWEEN 120 and 130;

--Display the results of the table variable.
SELECT ProductID, ProductName, ProductModelID, PhotoID 
FROM @MyTableVar
ORDER BY ProductModelID;
GO

G.Przy użyciu danych wyjściowych do dużego obiektu typu danych

Poniższy przykład aktualizuje wartości częściowej w DocumentSummary, nvarchar(max) kolumna w Production.Document tabela, za pomocą .WRITE klauzula.Wyraz components zastępuje wyraz features przez określenie wyraz zamiany lokalizacji początku (przesunięcie) program word zastępuje istniejące dane i liczba znaków jest zastępowany (długość).W przykładzie użyto OUTPUT klauzula zwrócić przed i po obrazy DocumentSummary kolumna , aby @MyTableVartable zmienną.Należy zauważyć, że pełna przed i po obrazy DocumentSummary kolumna są zwracane.

USE AdventureWorks2008R2;
GO
DECLARE @MyTableVar table (
    SummaryBefore nvarchar(max),
    SummaryAfter nvarchar(max));
UPDATE Production.Document
SET DocumentSummary .WRITE (N'features',28,10)
OUTPUT deleted.DocumentSummary, 
       inserted.DocumentSummary 
    INTO @MyTableVar
WHERE Title = N'Front Reflector Bracket Installation';
SELECT SummaryBefore, SummaryAfter 
FROM @MyTableVar;
GO

H.Korzystanie z danych wyjściowych w wyzwalacza INSTEAD OF

W poniższym przykładzie użyto OUTPUT klauzula w wyzwalaczu zwrócić wyniki operacji wyzwalacza.Po pierwsze, tworzony jest widok na ScrapReason tabela, a następnie INSTEAD OF INSERT wyzwalacz jest zdefiniowany w widoku, który pozwala jedynie Name kolumna tabela bazowa modyfikowane przez użytkownika.Ponieważ w kolumna ScrapReasonID jest IDENTITY kolumna tabela bazowa, wyzwalacz ignoruje wartości dostarczone przez użytkownika.Dzięki temu Aparat baz danych do automatycznego generowania poprawną wartość.Ponadto wartości podane przez użytkownika dla ModifiedDate jest ignorowany i zestaw bieżącą data.OUTPUTklauzula zwraca wartości faktycznie wstawione do ScrapReasontabela.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID('dbo.vw_ScrapReason','V') IS NOT NULL
    DROP VIEW dbo.vw_ScrapReason;
GO
CREATE VIEW dbo.vw_ScrapReason
AS (SELECT ScrapReasonID, Name, ModifiedDate
    FROM Production.ScrapReason);
GO
CREATE TRIGGER dbo.io_ScrapReason 
    ON dbo.vw_ScrapReason
INSTEAD OF INSERT
AS
BEGIN
--ScrapReasonID is not specified in the list of columns to be inserted 
--because it is an IDENTITY column.
    INSERT INTO Production.ScrapReason (Name, ModifiedDate)
        OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, 
               INSERTED.ModifiedDate
    SELECT Name, getdate()
    FROM inserted;
END
GO
INSERT vw_ScrapReason (ScrapReasonID, Name, ModifiedDate)
VALUES (99, N'My scrap reason','20030404');
GO

W tym miejscu jest zestaw wyników generowane w dniu 12 kwietnia 2004 r. ("2004-04-12').Należy zauważyć, że ScrapReasonIDActual i ModifiedDate kolumny odzwierciedlają wartości generowanych przez operację wyzwalacza, a nie wartości w INSERT instrukcja.

ScrapReasonID  Name             ModifiedDate

-------------  ---------------- -----------------------

17             My scrap reason  2004-04-12 16:23:33.050

I.Przy użyciu danych wyjściowych do tożsamości i kolumny obliczanej

Poniższy przykład tworzy EmployeeSales tabela a następnie wstawia kilka wierszy do go za pomocą INSERT instrukcja z SELECT instrukcja do pobierania danych z tabel źródło .EmployeeSalestabela zawiera kolumna ( EmployeeID) i obliczanej kolumna (ProjectedSales).Ponieważ wartości te są generowane przez Aparat baz danych programu SQL Server podczas wykonywania operacji wstawiania żadna z tych kolumn można zdefiniować w @MyTableVar.

USE AdventureWorks2008R2 ;
GO
IF OBJECT_ID ('dbo.EmployeeSales', 'U') IS NOT NULL
    DROP TABLE dbo.EmployeeSales;
GO
CREATE TABLE dbo.EmployeeSales
( EmployeeID   int IDENTITY (1,5)NOT NULL,
  LastName     nvarchar(20) NOT NULL,
  FirstName    nvarchar(20) NOT NULL,
  CurrentSales money NOT NULL,
  ProjectedSales AS CurrentSales * 1.10 
);
GO
DECLARE @MyTableVar table(
  LastName     nvarchar(20) NOT NULL,
  FirstName    nvarchar(20) NOT NULL,
  CurrentSales money NOT NULL
  );

INSERT INTO dbo.EmployeeSales (LastName, FirstName, CurrentSales)
  OUTPUT INSERTED.LastName, 
         INSERTED.FirstName, 
         INSERTED.CurrentSales
  INTO @MyTableVar
    SELECT c.LastName, c.FirstName, sp.SalesYTD
    FROM Sales.SalesPerson AS sp
    INNER JOIN Person.Person AS c
        ON sp.BusinessEntityID = c.BusinessEntityID
    WHERE sp.BusinessEntityID LIKE '2%'
    ORDER BY c.LastName, c.FirstName;

SELECT LastName, FirstName, CurrentSales
FROM @MyTableVar;
GO
SELECT EmployeeID, LastName, FirstName, CurrentSales, ProjectedSales
FROM dbo.EmployeeSales;
GO

J.Korzystanie z danych wyjściowych i dane wyjściowe do w pojedynczej instrukcja

W następującym przykładzie usunięto wiersze w ProductProductPhoto tabela na podstawie kryteriów wyszukiwania określonych w FROM klauzula DELETE instrukcja.OUTPUT INTOklauzula zwraca kolumny z tabela zostanie usunięty ( deleted.ProductID, deleted.ProductPhotoID) i kolumny z Producttabela do @MyTableVartable zmienną.Producttabela jest używana w FROMklauzula do określania wierszy do usunięcia. OUTPUTZwracaklauzula deleted.ProductID, deleted.ProductPhotoID kolumny oraz data i czas wiersz został usunięty z ProductProductPhototabela do aplikacji wywołującej.

USE AdventureWorks2008R2;
GO
DECLARE @MyTableVar table (
    ProductID int NOT NULL, 
    ProductName nvarchar(50)NOT NULL,
    ProductModelID int NOT NULL, 
    PhotoID int NOT NULL);

DELETE Production.ProductProductPhoto
OUTPUT DELETED.ProductID,
       p.Name,
       p.ProductModelID,
       DELETED.ProductPhotoID
    INTO @MyTableVar
OUTPUT DELETED.ProductID, DELETED.ProductPhotoID, GETDATE() AS DeletedDate 
FROM Production.ProductProductPhoto AS ph
JOIN Production.Product as p 
    ON ph.ProductID = p.ProductID 
WHERE p.ProductID BETWEEN 800 and 810;

--Display the results of the table variable.
SELECT ProductID, ProductName, PhotoID, ProductModelID 
FROM @MyTableVar;
GO

K.Wstawianie danych zwróconych przez wyjściowy klauzula

Poniższy przykład przechwytuje dane zwrócone z OUTPUT klauzula MERGE instrukcjai wstawia dane do innej tabela.MERGEAktualizacjiinstrukcja Quantitykolumna ProductInventorytabela codziennie, na podstawie zamówień, które są przetwarzane w SalesOrderDetailtabela. Usuwa także wiersze dla produktów, których zapasy upuść, aby 0 lub poniżej.Przykład przechwytuje wierszy, które są usuwane i wstawi je do innej tabela, ZeroInventory, ścieżek produktów o braku zapasów.

USE AdventureWorks2008R2;
GO
IF OBJECT_ID(N'Production.ZeroInventory', N'U') IS NOT NULL
    DROP TABLE Production.ZeroInventory;
GO
--Create ZeroInventory table.
CREATE TABLE Production.ZeroInventory (DeletedProductID int, RemovedOnDate DateTime);
GO

INSERT INTO Production.ZeroInventory (DeletedProductID, RemovedOnDate)
SELECT ProductID, GETDATE()
FROM
(   MERGE Production.ProductInventory AS pi
    USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail AS sod
           JOIN Sales.SalesOrderHeader AS soh
           ON sod.SalesOrderID = soh.SalesOrderID
           AND soh.OrderDate = '20070401'
           GROUP BY ProductID) AS src (ProductID, OrderQty)
    ON (pi.ProductID = src.ProductID)
    WHEN MATCHED AND pi.Quantity - src.OrderQty <= 0
        THEN DELETE
    WHEN MATCHED
        THEN UPDATE SET pi.Quantity = pi.Quantity - src.OrderQty
    OUTPUT $action, deleted.ProductID) AS Changes (Action, ProductID)
WHERE Action = 'DELETE';
IF @@ROWCOUNT = 0
PRINT 'Warning: No rows were inserted';
GO
SELECT DeletedProductID, RemovedOnDate FROM Production.ZeroInventory;