OUTPUT-Klausel (Transact-SQL)OUTPUT Clause (Transact-SQL)

DIESES THEMA GILT FÜR:jaSQL Server (ab 2008)jaAzure SQL-DatenbankneinAzure SQL Data Warehouse neinParallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Gibt Informationen aus bzw. Ausdrücke basierend auf den einzelnen Zeilen zurück, auf die eine INSERT-, UPDATE-, DELETE- oder MERGE-Anweisung Auswirkungen hat.Returns information from, or expressions based on, each row affected by an INSERT, UPDATE, DELETE, or MERGE statement. Diese Ergebnisse können an die verarbeitende Anwendung zurückgegeben werden, die sie z. B. für Bestätigungen, Archivierungen und andere Anwendungsanforderungen verwendet.These results can be returned to the processing application for use in such things as confirmation messages, archiving, and other such application requirements. Die Ergebnisse können auch in eine Tabelle oder Tabellenvariable eingefügt werden.The results can also be inserted into a table or table variable. Darüber hinaus können Sie die Ergebnisse einer OUTPUT-Klausel in einer geschachtelten INSERT-, UPDATE-, DELETE- oder MERGE-Anweisung aufzeichnen und diese Ergebnisse in eine Zieltabelle oder -sicht einfügen.Additionally, you can capture the results of an OUTPUT clause in a nested INSERT, UPDATE, DELETE, or MERGE statement, and insert those results into a target table or view.

Hinweis

Eine INSERT-, UPDATE- oder DELETE-Anweisung mit einer OUTPUT-Klausel gibt Zeilen auch dann an den Client zurück, wenn bei der Anweisung ein Fehler auftritt und ein Rollback ausgeführt wird.An UPDATE, INSERT, or DELETE statement that has an OUTPUT clause will return rows to the client even if the statement encounters errors and is rolled back. Wenn bei der Ausführung der Anweisung ein Fehler auftritt, sollte das Ergebnis nicht verwendet werden.The result should not be used if any error occurs when you run the statement.

Verwendet:Used in:

DELETEDELETE

INSERTINSERT

UPDATEUPDATE

MERGEMERGE

Themenlinksymbol Transact-SQL Syntax Conventions (Transact-SQL-Syntaxkonventionen)Topic link icon Transact-SQL Syntax Conventions

SyntaxSyntax


<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  

ArgumenteArguments

@table_variable@table_variable
Gibt eine Tabelle Variable, die die zurückgegebenen Zeilen eingefügt werden, statt an den Aufrufer zurückgegeben wird.Specifies a table variable that the returned rows are inserted into instead of being returned to the caller. @Table_variable muss vor der INSERT-, Update-, DELETE- oder MERGE-Anweisung deklariert werden. @table_variable must be declared before the INSERT, UPDATE, DELETE, or MERGE statement.

Wenn Column_list nicht angegeben wird, die Tabelle Variable muss die gleiche Anzahl von Spalten wie das OUTPUT-Resultset aufweisen.If column_list is not specified, the table variable must have the same number of columns as the OUTPUT result set. Ausnahmen bilden Identitätsspalten sowie berechnete Spalten, die ausgelassen werden müssen.The exceptions are identity and computed columns, which must be skipped. Wenn Column_list angegeben ist, alle ausgelassenen Spalten null-Werte zulassen müssen oder Standard-Werte zugewiesen.If column_list is specified, any omitted columns must either allow null values or have default values assigned to them.

Weitere Informationen zu Tabelle Variablen finden Sie unter Table ( Transact-SQL ) .For more information about table variables, see table (Transact-SQL).

output_tableoutput_table
Gibt eine Tabelle an, in die die zurückgegebenen Zeilen eingefügt werden, statt an den Aufrufer zurückgegeben zu werden.Specifies a table that the returned rows are inserted into instead of being returned to the caller. Output_table kann eine temporäre Tabelle sein.output_table may be a temporary table.

Wenn Column_list nicht angegeben ist, wird die Tabelle muss die gleiche Anzahl von Spalten wie das OUTPUT-Resultset aufweisen.If column_list is not specified, the table must have the same number of columns as the OUTPUT result set. Ausnahmen bilden Identitätsspalten sowie berechnete Spalten.The exceptions are identity and computed columns. Diese müssen ausgelassen werden.These must be skipped. Wenn Column_list angegeben ist, alle ausgelassenen Spalten null-Werte zulassen müssen oder Standard-Werte zugewiesen.If column_list is specified, any omitted columns must either allow null values or have default values assigned to them.

Output_table kann nicht:output_table cannot:

  • Keine Definition von aktivierten Triggern.Have enabled triggers defined on it.

  • Keine Beteiligung an einer der Seiten einer FOREIGN KEY-Einschränkung.Participate on either side of a FOREIGN KEY constraint.

  • Keine CHECK-Einschränkungen oder aktivierten Regeln.Have CHECK constraints or enabled rules.

column_listcolumn_list
Ist eine optionale Liste mit Spaltennamen in der Zieltabelle der INTO-Klausel.Is an optional list of column names on the target table of the INTO clause. Es ist analog zu der Liste der Spalten in zulässig der einfügen Anweisung.It is analogous to the column list allowed in the INSERT statement.

"scalar_expression"scalar_expression
Ist eine beliebige Kombination von Symbolen und Operatoren, die zu genau einem Wert ausgewertet werden.Is any combination of symbols and operators that evaluates to a single value. Aggregatfunktionen sind nicht zulässig "scalar_expression".Aggregate functions are not permitted in scalar_expression.

Alle Verweise auf Spalten in der Tabelle, die geändert wird, müssen mit dem INSERTED- oder DELETED-Präfix gekennzeichnet werden.Any reference to columns in the table being modified must be qualified with the INSERTED or DELETED prefix.

column_alias_identifiercolumn_alias_identifier
Ist ein alternativer Name, über den auf den Spaltennamen verwiesen wird.Is an alternative name used to reference the column name.

DELETEDDELETED
Ist ein Spaltenpräfix, das den durch den Update- oder Löschvorgang gelöschten Wert angibt.Is a column prefix that specifies the value deleted by the update or delete operation. Spalten mit dem DELETED-Präfix spiegeln den Wert vor dem Abschluss der UPDATE-, DELETE- oder MERGE-Anweisung wider.Columns prefixed with DELETED reflect the value before the UPDATE, DELETE, or MERGE statement is completed.

DELETED kann nicht mit der OUTPUT-Klausel in der INSERT-Anweisung verwendet werden.DELETED cannot be used with the OUTPUT clause in the INSERT statement.

INSERTEDINSERTED
Ist ein Spaltenpräfix, das den durch den Einfüge- oder Updatevorgang hinzugefügten Wert angibt.Is a column prefix that specifies the value added by the insert or update operation. Spalten mit dem INSERTED-Präfix spiegeln den Wert nach Abschluss der UPDATE-, INSERT- oder MERGE-Anweisung wider, jedoch vor dem Ausführen von Triggern.Columns prefixed with INSERTED reflect the value after the UPDATE, INSERT, or MERGE statement is completed but before triggers are executed.

INSERTED kann nicht mit der OUTPUT-Klausel in der DELETE-Anweisung verwendet werden.INSERTED cannot be used with the OUTPUT clause in the DELETE statement.

from_table_namefrom_table_name
Ist ein Spaltenpräfix, das eine Tabelle angibt, die in der FROM-Klausel einer DELETE-, UPDATE- oder MERGE-Anweisung enthalten ist, die wiederum zur Angabe der zu aktualisierenden oder zu löschenden Zeilen verwendet wird.Is a column prefix that specifies a table included in the FROM clause of a DELETE, UPDATE, or MERGE statement that is used to specify the rows to update or delete.

Wird die Tabelle, der geändert wird, auch in der FROM-Klausel angegeben, müssen alle Verweise auf Spalten in dieser Tabelle durch das INSERTED- oder DELETED-Präfix gekennzeichnet werden.If the table being modified is also specified in the FROM clause, any reference to columns in that table must be qualified with the INSERTED or DELETED prefix.

*
Gibt an, dass alle vom Lösch-, Einfüge- oder Updatevorgang betroffenen Spalten in der Reihenfolge zurückgegeben werden, in der sie in der Tabelle vorkommen.Specifies that all columns affected by the delete, insert, or update action will be returned in the order in which they exist in the table.

So gibt beispielsweise OUTPUT DELETED.* in der folgenden DELETE-Anweisung alle aus der ShoppingCartItem-Tabelle zurückgegebenen Spalten zurück:For example, OUTPUT DELETED.* in the following DELETE statement returns all columns deleted from the ShoppingCartItem table:

DELETE Sales.ShoppingCartItem  
    OUTPUT DELETED.*;  

Spaltennamecolumn_name
Ist ein expliziter Spaltenverweis.Is an explicit column reference. Alle Verweise auf die Tabelle geändert wird, muss werden richtig gekennzeichnet durch das inserted- oder DELETED-Präfix nach Bedarf, z. B.: INSERTED. Column_name.Any reference to the table being modified must be correctly qualified by either the INSERTED or the DELETED prefix as appropriate, for example: INSERTED.column_name.

$action$action
Ist verfügbar nur für die MERGE-Anweisung.Is available only for the MERGE statement. Gibt eine Spalte vom Typ nvarchar(10) in der OUTPUT-Klausel in einer MERGE-Anweisung, die einen von drei Werten für jede Zeile zurückgibt: 'INSERT', 'UPDATE' oder 'DELETE' die Aktion, die für diese Zeile ausgeführt wurde.Specifies a column of type nvarchar(10) in the OUTPUT clause in a MERGE statement that returns one of three values for each row: 'INSERT', 'UPDATE', or 'DELETE', according to the action that was performed on that row.

HinweiseRemarks

Die Ausgabe <Dml_select_list >-Klausel und die Ausgabe <Dml_select_list > INTO { @ Table_variable | Output_table }-Klausel kann in einer einzelnen INSERT-, Update-, DELETE- oder MERGE-Anweisung definiert werden.The OUTPUT <dml_select_list> clause and the OUTPUT <dml_select_list> INTO { @table_variable | output_table } clause can be defined in a single INSERT, UPDATE, DELETE, or MERGE statement.

Hinweis

Sofern nicht anderweitig angegeben, beziehen sich Verweise auf die OUTPUT-Klausel sowohl auf die OUTPUT- als auch die OUTPUT INTO-Klausel.Unless specified otherwise, references to the OUTPUT clause refer to both the OUTPUT clause and the OUTPUT INTO clause.

Die OUTPUT-Klausel kann zum Abrufen des Werts von Identitätsspalten oder berechneten Spalten nach einem INSERT- oder UPDATE-Vorgang genutzt werden.The OUTPUT clause may be useful to retrieve the value of identity or computed columns after an INSERT or UPDATE operation.

Wenn eine berechnete Spalte ist in enthalten die <Dml_select_list >, die entsprechende Spalte in der Ausgabetabelle oder Tabellenvariablen ist keine berechnete Spalte.When a computed column is included in the <dml_select_list>, the corresponding column in the output table or table variable is not a computed column. Die Werte in der neuen Spalte entsprechen den Werten, die zum Zeitpunkt der Ausführung der Anweisung berechnet wurden.The values in the new column are the values that were computed at the time the statement was executed.

Es kann nicht sichergestellt werden, dass die Reihenfolge, in der die Änderungen auf die Tabelle angewendet werden, der Reihenfolge entspricht, in der die Zeilen in die Ausgabetabelle oder -tabellenvariable eingefügt werden.There is no guarantee that the order in which the changes are applied to the table and the order in which the rows are inserted into the output table or table variable will correspond.

Wenn Parameter oder Variablen im Rahmen einer UPDATE-Anweisung geändert werden, gibt die OUTPUT-Klausel immer den Wert des Parameters oder der Variablen vor der Ausführung der Anweisung zurück, statt des geänderten Werts.If parameters or variables are modified as part of an UPDATE statement, the OUTPUT clause always returns the value of the parameter or variable as it was before the statement executed instead of the modified value.

OUTPUT kann mit einer UPDATE- oder DELETE-Anweisung auf einem Cursor mit WHERE CURRENT OF-Syntax verwendet werden.You can use OUTPUT with an UPDATE or DELETE statement positioned on a cursor that uses WHERE CURRENT OF syntax.

Die OUTPUT-Klausel wird von den folgenden Anweisungen nicht unterstützt:The OUTPUT clause is not supported in the following statements:

  • DML-Anweisungen, die auf lokale partitionierte Sichten, verteilte partitionierte Sichten oder Remotetabellen verweisen.DML statements that reference local partitioned views, distributed partitioned views, or remote tables.

  • INSERT-Anweisungen, die eine EXECUTE-Anweisung enthalten.INSERT statements that contain an EXECUTE statement.

  • Volltextprädikate sind in der OUTPUT-Klausel nicht zulässig, wenn der Kompatibilitätsgrad der Datenbank auf 100 festgelegt ist.Full-text predicates are not allowed in the OUTPUT clause when the database compatibility level is set to 100.

  • Die OUTPUT INTO-Klausel kann nicht zum Einfügen in eine Sicht oder eine Rowsetfunktion verwendet werden.The OUTPUT INTO clause cannot be used to insert into a view, or rowset function.

  • Eine benutzerdefinierte Funktion kann nicht erstellt werden, wenn eine OUTPUT INTO-Klausel enthalten ist, deren Ziel eine Tabelle ist.A user-defined function cannot be created if it contains an OUTPUT INTO clause that has a table as its target.

    Um ein nicht deterministisches Verhalten zu verhindern, kann die OUTPUT-Klausel die folgenden Verweise nicht enthalten:To prevent nondeterministic behavior, the OUTPUT clause cannot contain the following references:

  • Unterabfragen oder benutzerdefinierte Funktionen, die auf Benutzer- oder Systemdaten zugreifen bzw. bei denen davon ausgegangen wird, dass sie einen solchen Zugriff ausführen.Subqueries or user-defined functions that perform user or system data access, or are assumed to perform such access. Bei benutzerdefinierten Funktionen wird davon ausgegangen, dass sie auf Daten zugreifen, wenn sie nicht schemagebunden sind.User-defined functions are assumed to perform data access if they are not schema-bound.

  • Eine Spalte aus einer Sicht oder Inline-Tabellenwertfunktion, wenn diese Spalte durch eine der folgenden Methoden definiert wird:A column from a view or inline table-valued function when that column is defined by one of the following methods:

    • Eine Unterabfrage.A subquery.

    • Eine benutzerdefinierte Funktion, die auf Benutzer- oder Systemdaten zugreift bzw. bei der davon ausgegangen wird, dass sie einen solchen Zugriff ausführt.A user-defined function that performs user or system data access, or is assumed to perform such access.

    • Eine berechnete Spalte, die eine benutzerdefinierte Funktion enthält, die in ihrer Definition auf Benutzer- oder Systemdaten zugreift.A computed column that contains a user-defined function that performs user or system data access in its definition.

      Wenn SQL ServerSQL Server erkennt eine solche Spalte in der OUTPUT-Klausel Fehler 4186 ausgelöst.When SQL ServerSQL Server detects such a column in the OUTPUT clause, error 4186 is raised.

Einfügen von Daten aus einer OUTPUT-Klausel in eine TabelleInserting Data Returned From an OUTPUT Clause Into a Table

Wenn Sie die Ergebnisse einer OUTPUT-Klausel in einer geschachtelten INSERT-, UPDATE-, DELETE- oder MERGE-Anweisung aufzeichnen und diese Ergebnisse in eine Zieltabelle einfügen, müssen Sie Folgendes beachten:When you are capturing the results of an OUTPUT clause in a nested INSERT, UPDATE, DELETE, or MERGE statement and inserting those results into a target table, keep the following information in mind:

  • Der ganze Vorgang ist unteilbar.The whole operation is atomic. Führen Sie die INSERT-Anweisung und die geschachtelte DML-Anweisung, die die OUTPUT-Klausel enthält, oder die gesamte Anweisung schlägt fehl.Either both the INSERT statement and the nested DML statement that contains the OUTPUT clause execute, or the whole statement fails.

  • Die folgenden Einschränkungen gelten für das Ziel der äußeren INSERT-Anweisung:The following restrictions apply to the target of the outer INSERT statement:

    • Das Ziel darf keine Remotetabelle, keine Remotesicht und kein allgemeiner Tabellenausdruck sein.The target cannot be a remote table, view, or common table expression.

    • Das Ziel darf keine FOREIGN KEY-Einschränkung aufweisen, und es darf nicht durch eine FOREIGN KEY-Einschränkung darauf verwiesen werden.The target cannot have a FOREIGN KEY constraint, or be referenced by a FOREIGN KEY constraint.

    • Trigger können für das Ziel nicht definiert werden.Triggers cannot be defined on the target.

    • Das Ziel darf nicht Teil von Mergereplikationen oder aktualisierbaren Abonnements für Transaktionsreplikationen sein.The target cannot participate in merge replication or updatable subscriptions for transactional replication.

  • Die folgenden Einschränkungen gelten für die geschachtelte DML-Anweisung:The following restrictions apply to the nested DML statement:

    • Das Ziel darf keine Remotetabelle und keine partitionierte Sicht sein.The target cannot be a remote table or partitioned view.

    • Die Quelle selbst darf keine enthalten eine <Dml_table_source >-Klausel.The source itself cannot contain a <dml_table_source> clause.

  • Die OUTPUT INTO-Klausel wird nicht unterstützt, in der INSERT-Anweisungen, die enthalten eine <Dml_table_source >-Klausel.The OUTPUT INTO clause is not supported in INSERT statements that contain a <dml_table_source> clause.

  • @@ROWCOUNT gibt die Zeilen, die nur von der äußeren INSERT-Anweisung eingefügt.@@ROWCOUNT returns the rows inserted only by the outer INSERT statement.

  • @@IDENTITY, SCOPE_IDENTITY und IDENT_CURRENT, die nur von der geschachtelten DML-Anweisung generierten Identitätswerte und nicht die, die von der äußeren INSERT-Anweisung generierten zurückzugeben.@@IDENTITY, SCOPE_IDENTITY, and IDENT_CURRENT return identity values generated only by the nested DML statement, and not those generated by the outer INSERT statement.

  • In Abfragebenachrichtigungen gilt die Anweisung als einzelne Entität, und der Typ aller erstellten Benachrichtigungen wird auf den Typ der geschachtelten DML-Anweisung festgelegt, selbst wenn die signifikante Änderung von der äußeren INSERT-Anweisung stammt.Query notifications treat the statement as a single entity, and the type of any message that is created will be the type of the nested DML, even if the significant change is from the outer INSERT statement itself.

  • In der <Dml_table_source >-Klausel, die SELECT-Anweisung und, in denen Klauseln Unterabfragen, Aggregatfunktionen, Rangfolgefunktionen, Volltextprädikate, benutzerdefinierte Funktionen, die Datenzugriff ausführt, oder der TEXTPTR-Funktion enthalten kann.In the <dml_table_source> clause, the SELECT and WHERE clauses cannot include subqueries, aggregate functions, ranking functions, full-text predicates, user-defined functions that perform data access, or the TEXTPTR function.

ParallelitätParallelism

Eine OUTPUT-Klausel, die Ergebnisse an den Client zurückgibt, wird immer einen seriellen Plan verwendet.An OUTPUT clause that returns results to the client will always use a serial plan.

Im Kontext einer Datenbank auf festgelegten Kompatibilitätsgrad 130 oder höher, wenn eine INSERT... SELECT-Vorgang verwendet einen Hinweis WITH (TABLOCK) für die SELECT-Anweisung und auch Ausgabe... INTO zum Einfügen in eine temporäre oder Benutzer-Tabelle, und klicken Sie dann auf die Zieltabelle für die INSERT... Wählen Sie werden für die Parallelität, abhängig von der Teilstruktur Kosten geeignet sein.In the context of a database set to compatibility level 130 or higher, if an INSERT...SELECT operation uses a WITH (TABLOCK) hint for the SELECT statement and also uses OUTPUT…INTO to insert into a temporary or user table, then the target table for the INSERT…SELECT will be eligible for parallelism depending on the subtree cost. Die Zieltabelle verwiesen wird, in der OUTPUT INTO-Klausel wird nicht für Parallelität berechtigt sein.The target table referenced in the OUTPUT INTO clause will not be eligible for parallelism.

TriggerTriggers

Von OUTPUT zurückgegebene Spalten spiegeln die Daten nach Abschluss der INSERT-, UPDATE- oder DELETE-Anweisung wider, jedoch vor der Ausführung der Trigger.Columns returned from OUTPUT reflect the data as it is after the INSERT, UPDATE, or DELETE statement has completed but before triggers are executed.

Bei INSTEAD OF-Triggern werden die zurückgegebenen Ergebnisse so generiert, als ob die INSERT-, UPDATE- oder DELETE-Anweisung tatsächlich stattgefunden hat, selbst wenn keine Änderungen als Folge des Triggervorgangs vorgenommen werden.For INSTEAD OF triggers, the returned results are generated as if the INSERT, UPDATE, or DELETE had actually occurred, even if no modifications take place as the result of the trigger operation. Wird eine Anweisung, die eine OUTPUT-Klausel enthält, innerhalb eines Triggers verwendet, müssen Tabellenaliase zum Verweisen auf die Tabellen inserted und deleted des Triggers verwendet werden, um das Duplizieren von Spaltenverweisen mithilfe der OUTPUT zugeordneten Tabellen INSERTED und DELETED zu vermeiden.If a statement that includes an OUTPUT clause is used inside the body of a trigger, table aliases must be used to reference the trigger inserted and deleted tables to avoid duplicating column references with the INSERTED and DELETED tables associated with OUTPUT.

Wird die OUTPUT-Klausel angegeben, ohne auch das INTO-Schlüsselwort anzugeben, kann für das Ziel des DML-Vorgangs kein aktivierter Trigger für die bestimmte DML-Aktion definiert werden.If the OUTPUT clause is specified without also specifying the INTO keyword, the target of the DML operation cannot have any enabled trigger defined on it for the given DML action. Wird beispielsweise die OUTPUT-Klausel in einer UPDATE-Anweisung definiert, können keine aktivierten UPDATE-Trigger für die Zieltabelle festgelegt werden.For example, if the OUTPUT clause is defined in an UPDATE statement, the target table cannot have any enabled UPDATE triggers.

Wird die sp_configure-Option Ergebnisse von Triggern nicht zulassen festgelegt, hat eine OUTPUT-Klausel ohne INTO-Klausel zur Folge, dass die Anweisung fehlschlägt, wenn sie aus einem Trigger heraus aufgerufen wird.If the sp_configure option disallow results from triggers is set, an OUTPUT clause without an INTO clause causes the statement to fail when it is invoked from within a trigger.

DatentypenData Types

Die OUTPUT-Klausel unterstützt die großen Objektdatentypen: nvarchar(max), varchar(max), varbinary(max), Text, Ntext, Image, und Xml.The OUTPUT clause supports the large object data types: nvarchar(max), varchar(max), varbinary(max), text, ntext, image, and xml. Bei Verwendung der. WRITE-Klausel in der UPDATE-Anweisung zum Ändern einer nvarchar(max), varchar(max), oder varbinary(max) Spalte, die vollständigen Anfangs- und endimages der Werte sind wird zurückgegeben, wenn auf Sie verwiesen werden.When you use the .WRITE clause in the UPDATE statement to modify an nvarchar(max), varchar(max), or varbinary(max) column, the full before and after images of the values are returned if they are referenced. Die TEXTPTR ()-Funktion kann nicht als Teil eines Ausdrucks angezeigt, auf eine Text, Ntext, oder Image Spalte in der OUTPUT-Klausel.The TEXTPTR( ) function cannot appear as part of an expression on a text, ntext, or image column in the OUTPUT clause.

WarteschlangenQueues

OUTPUT kann in Anwendungen, die Tabellen als Warteschlangen verwenden, oder zum Aufbewahren von Zwischenresultsets verwendet werden.You can use OUTPUT in applications that use tables as queues, or to hold intermediate result sets. Die Anwendung fügt der Tabelle somit kontinuierlich Zeilen hinzu oder entfernt sie daraus.That is, the application is constantly adding or removing rows from the table. Im folgenden Beispiel wird die OUTPUT-Klausel in einer DELETE-Anweisung verwendet, um die gelöschte Zeile an die aufrufende Anwendung zurückzugeben.The following example uses the OUTPUT clause in a DELETE statement to return the deleted row to the calling application.

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

In diesem Beispiel wird eine Zeile aus einer als Warteschlange verwendeten Tabelle entfernt und die gelöschten Werte in einer einzigen Aktion an die verarbeitende Anwendung zurückgegeben.This example removes a row from a table used as a queue and returns the deleted values to the processing application in a single action. Zusätzliche Semantik kann ebenfalls implementiert werden, wie z. B. die Verwendung einer Tabelle zum Implementieren eines Stapels.Other semantics may also be implemented, such as using a table to implement a stack. SQL ServerSQL Server stellt jedoch die Reihenfolge nicht sicher, in der Zeilen verarbeitet und von DML-Anweisungen mithilfe der OUTPUT-Klausel zurückgegeben werden.However, SQL ServerSQL Server does not guarantee the order in which rows are processed and returned by DML statements using the OUTPUT clause. Es hängt von der Anwendung ab, eine entsprechende WHERE-Klausel einzufügen, die die gewünschte Semantik sicherstellen kann. Wenn mehrere Zeilen Anspruch auf den DML-Vorgang haben, kann keine bestimmte Reihenfolge sichergestellt werden.It is up to the application to include an appropriate WHERE clause that can guarantee the desired semantics, or understand that when multiple rows may qualify for the DML operation, there is no guaranteed order. Im folgenden Beispiel wird eine Unterabfrage verwendet und davon ausgegangen, dass die DatabaseLogID-Spalte eindeutig ist, um die gewünschte Reihenfolgensemantik zu implementieren.The following example uses a subquery and assumes uniqueness is a characteristic of the DatabaseLogID column in order to implement the desired ordering semantics.

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  

Hinweis

Verwenden Sie den READPAST-Tabellenhinweis in UPDATE- und DELETE-Anweisungen, wenn es in Ihrem Szenario möglich ist, dass mehrere Anwendungen einen destruktiven Lesevorgang aus einer Tabelle ausführen.Use the READPAST table hint in UPDATE and DELETE statements if your scenario allows for multiple applications to perform a destructive read from one table. So werden Sperrkonflikte verhindert, die entstehen, wenn eine andere Anwendung bereits den ersten berechtigten Datensatz in der Tabelle liest.This prevents locking issues that can come up if another application is already reading the first qualifying record in the table.

BerechtigungenPermissions

SELECT-Berechtigungen sind erforderlich, auf alle Spalten, die über abgerufen <Dml_select_list > oder in nicht verwendete <"scalar_expression" >.SELECT permissions are required on any columns retrieved through <dml_select_list> or used in <scalar_expression>.

INSERT-Berechtigungen sind erforderlich, für alle Tabellen <Output_table >.INSERT permissions are required on any tables specified in <output_table>.

BeispieleExamples

A.A. Verwenden von OUTPUT INTO mit einer einfachen INSERT-AnweisungUsing OUTPUT INTO with a simple INSERT statement

Das folgende Beispiel fügt eine Zeile in der ScrapReason Tabelle und verwendet die OUTPUT -Klausel, um die Ergebnisse der Anweisung zum Zurückgeben der @MyTableVar``table Variable.The following example inserts a row into the ScrapReason table and uses the OUTPUT clause to return the results of the statement to the @MyTableVar``table variable. Da die ScrapReasonID-Spalte mit einer IDENTITY-Eigenschaft definiert wurde, wird kein Wert in der INSERT-Anweisung für diese Spalte angegeben.Because the ScrapReasonID column is defined with an IDENTITY property, a value is not specified in the INSERT statement for that column. Der von DatenbankmodulDatabase Engine für diese Spalte generierte Wert wird jedoch in der OUTPUT-Klausel in der inserted.ScrapReasonID-Spalte zurückgegeben.However, note that the value generated by the DatenbankmodulDatabase Engine for that column is returned in the OUTPUT clause in the column inserted.ScrapReasonID.

USE AdventureWorks2012;  
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.B. Verwenden von OUTPUT mit einer DELETE-AnweisungUsing OUTPUT with a DELETE statement

Im folgenden Beispiel werden alle Zeilen in der ShoppingCartItem-Tabelle gelöscht.The following example deletes all rows in the ShoppingCartItem table. Die OUTPUT deleted.*-Klausel gibt an, dass die Ergebnisse der DELETE-Anweisung, also alle Spalten in den gelöschten Zeilen, an die aufrufende Anweisung zurückgegeben werden.The clause OUTPUT deleted.* specifies that the results of the DELETE statement, that is all columns in the deleted rows, be returned to the calling application. Die nachfolgende SELECT-Anweisung überprüft die Ergebnisse des Löschvorgangs in der ShoppingCartItem-Tabelle.The SELECT statement that follows verifies the results of the delete operation on the ShoppingCartItem table.

USE AdventureWorks2012;  
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.C. Verwenden von OUTPUT INTO mit einer UPDATE-AnweisungUsing OUTPUT INTO with an UPDATE statement

Im folgenden Beispiel werden die ersten zehn Zeilen der VacationHours-Spalte in der Employee-Tabelle um 25% aktualisiert.The following example updates the VacationHours column in the Employee table by 25 percent for the first 10 rows. Die OUTPUT -Klausel zurück, die VacationHours Wert vor dem Anwenden der UPDATE Anweisung in der Spalte deleted.VacationHours, und den aktualisierten Wert in der Spalte inserted.VacationHours auf die @MyTableVar``table Variable.The OUTPUT clause returns the VacationHours value that exists before applying the UPDATE statement in the column deleted.VacationHours, and the updated value in the column inserted.VacationHours to the @MyTableVar``table variable.

Es folgen zwei SELECT-Anweisungen, die die Werte in @MyTableVar und die Ergebnisse des Updatevorgangs in der Employee-Tabelle zurückgeben.Two SELECT statements follow that return the values in @MyTableVar and the results of the update operation in the Employee table.

USE AdventureWorks2012;  
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.D. Verwenden von OUTPUT INTO zum Zurückgeben eines AusdrucksUsing OUTPUT INTO to return an expression

Das folgende Beispiel baut auf Beispiel C auf, indem ein Ausdruck in der OUTPUT-Klausel definiert wird, der die Differenz zwischen dem aktualisierten VacationHours-Wert und dem VacationHours-Wert vor dem Update beschreibt.The following example builds on example C by defining an expression in the OUTPUT clause as the difference between the updated VacationHours value and the VacationHours value before the update was applied. Der Wert dieses Ausdrucks wird zurückgegeben, um die @MyTableVar``table Variable in der Spalte VacationHoursDifference.The value of this expression is returned to the @MyTableVar``table variable in the column VacationHoursDifference.

USE AdventureWorks2012;  
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.E. Verwenden von OUTPUT INTO mit from_table_name in einer UPDATE-AnweisungUsing OUTPUT INTO with from_table_name in an UPDATE statement

Das folgende Beispiel aktualisiert die ScrapReasonID Spalte in der WorkOrder für alle Arbeitsaufträge mit einer angegebenen Tabelle ProductID und ScrapReasonID.The following example updates the ScrapReasonID column in the WorkOrder table for all work orders with a specified ProductID and ScrapReasonID. Die OUTPUT INTO-Klausel gibt Werte aus der Tabelle, die aktualisiert wird (WorkOrder), sowie aus der Product-Tabelle zurück.The OUTPUT INTO clause returns values from the table being updated (WorkOrder) and also from the Product table. Die Product-Tabelle wird in der FROM-Klausel zur Angabe der zu aktualisierenden Zeilen verwendet.The Product table is used in the FROM clause to specify the rows to update. Da für die WorkOrder-Tabelle ein AFTER UPDATE-Trigger definiert wurde, wird das INTO-Schlüsselwort benötigt.Because the WorkOrder table has an AFTER UPDATE trigger defined on it, the INTO keyword is required.

USE AdventureWorks2012;  
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.F. Verwenden von OUTPUT INTO mit from_table_name in einer DELETE-AnweisungUsing OUTPUT INTO with from_table_name in a DELETE statement

Im folgenden Beispiel werden Zeilen in der ProductProductPhoto-Tabelle auf der Grundlage von in der FROM-Klausel der DELETE-Anweisung definierten Suchkriterien gelöscht.The following example deletes rows in the ProductProductPhoto table based on search criteria defined in the FROM clause of DELETE statement. Die OUTPUT-Klausel gibt Spalten aus der Tabelle zurück, die gelöscht wird (deleted.ProductID, deleted.ProductPhotoID), sowie Spalten aus der Product-Tabelle.The OUTPUT clause returns columns from the table being deleted (deleted.ProductID, deleted.ProductPhotoID) and columns from the Product table. Diese Tabelle wird in der FROM-Klausel zur Angabe der zu löschenden Zeilen verwendet.This table is used in the FROM clause to specify the rows to delete.

USE AdventureWorks2012;  
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.G. Verwenden von OUTPUT INTO mit einem großen ObjektdatentypUsing OUTPUT INTO with a large object data type

Im folgenden Beispiel wird ein Teilwert in DocumentSummary, eine nvarchar(max)-Spalte in der Production.Document-Tabelle, mithilfe der .WRITE-Klausel aktualisiert.The following example updates a partial value in DocumentSummary, an nvarchar(max) column in the Production.Document table, by using the .WRITE clause. Der Begriff components wird durch den Begriff features ersetzt, indem der Ersatzbegriff, die Anfangsposition (offset) des zu ersetzenden Begriffs in den vorhandenen Daten und die Anzahl der zu ersetzenden Zeichen (length) angegeben werden.The word components is replaced by the word features by specifying the replacement word, the beginning location (offset) of the word to be replaced in the existing data, and the number of characters to be replaced (length). Im Beispiel wird die OUTPUT -Klausel zur Rückgabe der Anfangs- und endimages der der DocumentSummary Spalte die @MyTableVar``table Variable.The example uses the OUTPUT clause to return the before and after images of the DocumentSummary column to the @MyTableVar``table variable. Hierbei werden die vollständigen Anfangs- und Endimages der DocumentSummary-Spalte zurückgegeben.Note that the full before and after images of the DocumentSummary column are returned.

USE AdventureWorks2012;  
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.H. Verwenden von OUTPUT in einem INSTEAD OF-TriggerUsing OUTPUT in an INSTEAD OF trigger

Im folgenden Beispiel werden die Ergebnisse des Triggervorgangs mithilfe der OUTPUT-Klausel in einem Trigger zurückgegeben.The following example uses the OUTPUT clause in a trigger to return the results of the trigger operation. Zunächst wird eine Sicht in der ScrapReason-Tabelle erstellt und anschließend ein INSTEAD OF INSERT-Trigger für die Sicht definiert, der nur zulässt, dass Benutzer die Name-Spalte der Basistabelle ändern können.First, a view is created on the ScrapReason table, and then an INSTEAD OF INSERT trigger is defined on the view that lets only the Name column of the base table to be modified by the user. Da die ScrapReasonID-Spalte eine IDENTITY-Spalte in der Basistabelle ist, ignoriert der Trigger den vom Benutzer bereitgestellten Wert.Because the column ScrapReasonID is an IDENTITY column in the base table, the trigger ignores the user-supplied value. Dadurch kann DatenbankmodulDatabase Engine automatisch den richtigen Wert generieren.This allows the DatenbankmodulDatabase Engine to automatically generate the correct value. Darüber hinaus wird der vom Benutzer für ModifiedDate bereitgestellte Wert ignoriert und auf das aktuelle Datum festgelegt.Also, the value supplied by the user for ModifiedDate is ignored and is set to the current date. Die OUTPUT-Klausel gibt die tatsächlich in die ScrapReason-Tabelle eingefügten Werte zurück.The OUTPUT clause returns the values actually inserted into the ScrapReason table.

USE AdventureWorks2012;  
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  

Dies ist das am 12. April 2004 ('2004-04-12') generierte Resultset.Here is the result set generated on April 12, 2004 ('2004-04-12'). Die Spalten ScrapReasonIDActual und ModifiedDate spiegeln die vom Triggervorgang generierten Werte wider, anstelle der von der INSERT-Anweisung bereitgestellten Werte.Notice that the ScrapReasonIDActual and ModifiedDate columns reflect the values generated by the trigger operation instead of the values provided in the INSERT statement.

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

I.I. Verwenden von OUTPUT INTO mit Identitätsspalten und berechneten SpaltenUsing OUTPUT INTO with identity and computed columns

Im folgenden Beispiel wird die EmployeeSales-Tabelle erstellt, und anschließend werden mehrere Zeilen unter Verwendung einer INSERT-Anweisung mit einer SELECT-Anweisung in die Tabelle eingefügt, um Daten aus Quelltabellen abzurufen.The following example creates the EmployeeSales table and then inserts several rows into it using an INSERT statement with a SELECT statement to retrieve data from source tables. Die EmployeeSales-Tabelle enthält eine Identitätsspalte (EmployeeID) und eine berechnete Spalte (ProjectedSales).The EmployeeSales table contains an identity column (EmployeeID) and a computed column (ProjectedSales).

USE AdventureWorks2012 ;  
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(  
  EmployeeID   int NOT NULL,  
  LastName     nvarchar(20) NOT NULL,  
  FirstName    nvarchar(20) NOT NULL,  
  CurrentSales money NOT NULL,  
  ProjectedSales 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 EmployeeID, LastName, FirstName, CurrentSales, ProjectedSales  
FROM @MyTableVar;  
GO  
SELECT EmployeeID, LastName, FirstName, CurrentSales, ProjectedSales  
FROM dbo.EmployeeSales;  
GO  

J.J. Verwenden von OUTPUT und OUTPUT INTO in einer einzelnen AnweisungUsing OUTPUT and OUTPUT INTO in a single statement

Im folgenden Beispiel werden Zeilen in der ProductProductPhoto-Tabelle auf der Grundlage von in der FROM-Klausel der DELETE-Anweisung definierten Suchkriterien gelöscht.The following example deletes rows in the ProductProductPhoto table based on search criteria defined in the FROM clause of DELETE statement. Die OUTPUT INTO -Klausel gibt Spalten aus der Tabelle gelöscht wird (deleted.ProductID, deleted.ProductPhotoID) und Spalten aus der Product Tabelle, auf die @MyTableVar``table Variable.The OUTPUT INTO clause returns columns from the table being deleted (deleted.ProductID, deleted.ProductPhotoID) and columns from the Product table to the @MyTableVar``table variable. Die Product-Tabelle wird in der FROM-Klausel zur Angabe der zu löschenden Zeilen verwendet.The Product table is used in the FROM clause to specify the rows to delete. Die OUTPUT-Klausel gibt die Spalten deleted.ProductID und deleted.ProductPhotoID sowie das Datum und die Uhrzeit des Löschens der Zeile aus der ProductProductPhoto-Tabelle an die aufrufende Anwendung zurück.The OUTPUT clause returns the deleted.ProductID, deleted.ProductPhotoID columns and the date and time the row was deleted from the ProductProductPhoto table to the calling application.

USE AdventureWorks2012;  
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.K. Einfügen von Daten, die von einer OUTPUT-Klausel zurückgegeben wurdenInserting data returned from an OUTPUT clause

Im folgenden Beispiel werden von der OUTPUT-Klausel einer MERGE-Anweisung zurückgegebene Daten erfasst und in eine andere Tabelle eingefügt.The following example captures data returned from the OUTPUT clause of a MERGE statement, and inserts that data into another table. Die MERGE-Anweisung aktualisiert die Quantity-Spalte der ProductInventory-Tabelle täglich auf Grundlage der Bestellungen, die in der SalesOrderDetail-Tabelle verarbeitet werden.The MERGE statement updates the Quantity column of the ProductInventory table daily, based on orders that are processed in the SalesOrderDetail table. Außerdem werden die Zeilen für Produkte gelöscht, deren Bestand auf 0 oder darunter fällt.It also deletes rows for products whose inventories drop to 0 or below. Das Beispiel erfasst die gelöschten Zeilen und fügt sie in einer anderen Tabelle (ZeroInventory) ein, in der Produkte ohne Bestand gespeichert werden.The example captures the rows that are deleted and inserts them into another table, ZeroInventory, which tracks products with no inventory.

USE AdventureWorks2012;  
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;  

Siehe auchSee Also

DELETE (Transact-SQL) DELETE (Transact-SQL)
INSERT (Transact-SQL) INSERT (Transact-SQL)
UPDATE (Transact-SQL) UPDATE (Transact-SQL)
Table ( Transact-SQL ) table (Transact-SQL)
CREATE TRIGGER (Transact-SQL) CREATE TRIGGER (Transact-SQL)
sp_configure (Transact-SQL)sp_configure (Transact-SQL)