OUTPUT 句 (Transact-SQL)OUTPUT Clause (Transact-SQL)

適用対象: ○SQL Server (2008 以降) ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

INSERT、UPDATE、DELETE、または MERGE の各ステートメントの影響を受ける行の情報や、それらに基づく式を返します。Returns information from, or expressions based on, each row affected by an INSERT, UPDATE, DELETE, or MERGE statement. これらの結果は処理アプリケーションに返され、確認メッセージの表示、アーカイブ化、その他のアプリケーション要件で使用することができます。These results can be returned to the processing application for use in such things as confirmation messages, archiving, and other such application requirements. また、結果をテーブルまたはテーブル変数に挿入することもできます。The results can also be inserted into a table or table variable. さらに、入れ子になった INSERT、UPDATE、DELETE、または MERGE ステートメント内の OUTPUT 句の結果を取得して対象のテーブルまたはビューに挿入することもできます。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.

注意

UPDATE、INSERT、または DELETE ステートメントに OUTPUT 句があると、ステートメントでエラーが発生してロールバックされた場合にも、クライアントに行が返されます。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. ステートメントの実行時にエラーが発生した場合は、結果を使用しないでください。The result should not be used if any error occurs when you run the statement.

使用される場所:Used in:

DELETEDELETE

INSERTINSERT

UPDATEUPDATE

MERGEMERGE

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax


<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  

引数Arguments

@table_variable@table_variable
返される行を呼び出し元に返さずにテーブルに挿入する場合に、挿入先となる table 変数を指定します。Specifies a table variable that the returned rows are inserted into instead of being returned to the caller. @table_variable は、INSERT、UPDATE、DELETE、または MERGE ステートメントの前に宣言する必要があります。@table_variable must be declared before the INSERT, UPDATE, DELETE, or MERGE statement.

column_list を指定しない場合は、table 変数の列の数は OUTPUT の結果セットと同じであることが必要です。If column_list is not specified, the table variable must have the same number of columns as the OUTPUT result set. ただし、ID 列と計算列はスキップされるため、同じである必要はありません。The exceptions are identity and computed columns, which must be skipped. column_list を指定した場合は、省略された列は NULL 値を許容しているか、既定値が割り当てられている必要があります。If column_list is specified, any omitted columns must either allow null values or have default values assigned to them.

table 変数の詳細については、「table (Transact-SQL)」を参照してください。For more information about table variables, see table (Transact-SQL).

output_tableoutput_table
返される行を呼び出し元に返さずにテーブルに挿入する場合に、挿入先となるテーブルを指定します。Specifies a table that the returned rows are inserted into instead of being returned to the caller. output_table には一時テーブルを指定することもできます。output_table may be a temporary table.

column_list を指定しない場合は、テーブルの列数は OUTPUT の結果セットと同じであることが必要です。If column_list is not specified, the table must have the same number of columns as the OUTPUT result set. ID 列と計算列は同じである必要はありません。The exceptions are identity and computed columns. スキップされるためです。These must be skipped. column_list を指定した場合は、省略された列は NULL 値を許容しているか、既定値が割り当てられている必要があります。If column_list is specified, any omitted columns must either allow null values or have default values assigned to them.

output_table には、次のテーブルを指定できません。output_table cannot:

  • トリガーが定義され有効化されているテーブルHave enabled triggers defined on it.

  • FOREIGN KEY 制約のどちらかの側になっているテーブルParticipate on either side of a FOREIGN KEY constraint.

  • CHECK 制約が定義されているか、ルールが有効化されているテーブルHave CHECK constraints or enabled rules.

column_listcolumn_list
INTO 句の対象テーブル上のオプションの列名のリストです。Is an optional list of column names on the target table of the INTO clause. INSERT ステートメントで指定できる列リストと似ています。It is analogous to the column list allowed in the INSERT statement.

scalar_expressionscalar_expression
単一の値に評価される、記号や演算子の任意の組み合わせです。Is any combination of symbols and operators that evaluates to a single value. 集計関数を scalar_expression の中で使用することはできません。Aggregate functions are not permitted in scalar_expression.

テーブル内の変更する列への参照は、INSERTED プレフィックスまたは DELETED プレフィックスで修飾する必要があります。Any reference to columns in the table being modified must be qualified with the INSERTED or DELETED prefix.

column_alias_identifiercolumn_alias_identifier
列名を参照するために使用する代替名です。Is an alternative name used to reference the column name.

DELETEDDELETED
更新操作または削除操作で削除される値を指定する列プレフィックスです。Is a column prefix that specifies the value deleted by the update or delete operation. DELETED プレフィックスの付いた列は、UPDATE、DELETE、または MERGE ステートメントが完了する前の値を反映します。Columns prefixed with DELETED reflect the value before the UPDATE, DELETE, or MERGE statement is completed.

INSERT ステートメント内で DELETED を OUTPUT 句と共に使用することはできません。DELETED cannot be used with the OUTPUT clause in the INSERT statement.

INSERTEDINSERTED
挿入操作または更新操作で追加される値を指定する列プレフィックスです。Is a column prefix that specifies the value added by the insert or update operation. INSERTED プレフィックスの付いた列は、UPDATE、INSERT、または MERGE ステートメントが完了した後の、トリガーが実行される前の値を反映します。Columns prefixed with INSERTED reflect the value after the UPDATE, INSERT, or MERGE statement is completed but before triggers are executed.

DELETE ステートメント内で INSERTED を OUTPUT 句と共に使用することはできません。INSERTED cannot be used with the OUTPUT clause in the DELETE statement.

from_table_namefrom_table_name
DELETE、UPDATE、または MERGE ステートメントの FROM 句に含まれるテーブルを指定する列プレフィックスです。更新または削除する行を指定するために使用します。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.

変更するテーブルが FROM 句でも指定されている場合には、そのテーブルの列への参照は、すべて INSERTED プレフィックスまたは DELETED プレフィックスで修飾する必要があります。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.

*
削除、挿入または更新操作で影響を受けるすべての列を、テーブル中に存在する順序で返すよう指示します。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.

たとえば、次の DELETE ステートメントの OUTPUT DELETED.* は、ShoppingCartItem テーブルから削除されるすべての列を返します。For example, OUTPUT DELETED.* in the following DELETE statement returns all columns deleted from the ShoppingCartItem table:

DELETE Sales.ShoppingCartItem  
    OUTPUT DELETED.*;  

column_namecolumn_name
明示的な列参照です。Is an explicit column reference. 変更するテーブルへのすべての参照は、たとえば INSERTED .column_name のように、INSERTED プレフィックスまたは DELETED プレフィックスで正しく修飾されている必要があります。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
MERGE ステートメントでのみ使用できます。Is available only for the MERGE statement. MERGE ステートメントの OUTPUT 句に nvarchar(10) 型の列を指定します。この MERGE ステートメントは、行に対して実行されたアクションに従って 'INSERT'、'UPDATE'、'DELETE' のいずれかの値をそれぞれの行について返します。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.

RemarksRemarks

OUTPUT <dml_select_list> 句と OUTPUT <dml_select_list> INTO { @table_variable | output_table } 句を単一の INSERT ステートメント、UPDATE ステートメント、DELETE ステートメント、または MERGE ステートメントで定義することができます。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.

注意

特に指定しない限り、OUTPUT 句への参照は、OUTPUT 句と OUTPUT INTO 句の両方を参照します。Unless specified otherwise, references to the OUTPUT clause refer to both the OUTPUT clause and the OUTPUT INTO clause.

OUTPUT 句は、INSERT 操作や UPDATE 操作の後で ID 列や計算列の値を取得するのに便利です。The OUTPUT clause may be useful to retrieve the value of identity or computed columns after an INSERT or UPDATE operation.

計算列が <dml_select_list> に含まれている場合、出力テーブルまたはテーブル変数内の対応する列は計算列ではありません。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. 新しい列の値は、ステートメントが実行された時点で計算された値を持つ列になります。The values in the new column are the values that were computed at the time the statement was executed.

テーブルに対して変更が適用される順序と、出力テーブルやテーブル変数に行が挿入される順序が、対応する保証はありません。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.

UPDATE ステートメントの一部としてパラメーターまたは変数が変更されると、OUTPUT 句は常に、パラメーターや変数の変更後の値ではなく、ステートメントを実行する前の値を返します。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 は、WHERE CURRENT OF 構文を使用したカーソル位置での UPDATE ステートメントや DELETE ステートメントと共に使用することができます。You can use OUTPUT with an UPDATE or DELETE statement positioned on a cursor that uses WHERE CURRENT OF syntax.

OUTPUT 句は、次のステートメントではサポートされません。The OUTPUT clause is not supported in the following statements:

  • ローカル パーティション ビュー、分散パーティション ビュー、またはリモート テーブルを参照する DML ステートメントDML statements that reference local partitioned views, distributed partitioned views, or remote tables.

  • EXECUTE ステートメントを含む INSERT ステートメントINSERT statements that contain an EXECUTE statement.

  • データベースの互換性レベルが 100 に設定されている場合、OUTPUT 句でフルテキスト述語を使用することはできません。Full-text predicates are not allowed in the OUTPUT clause when the database compatibility level is set to 100.

  • OUTPUT INTO 句は、ビューまたは行セット関数に挿入して使用することはできません。The OUTPUT INTO clause cannot be used to insert into a view, or rowset function.

  • ユーザー定義関数に出力先がテーブルである OUTPUT INTO 句が含まれている場合、このような関数は作成できません。A user-defined function cannot be created if it contains an OUTPUT INTO clause that has a table as its target.

    非決定的な動作を防ぐため、OUTPUT 句に次の参照を含めることはできません。To prevent nondeterministic behavior, the OUTPUT clause cannot contain the following references:

  • ユーザー データやシステム データにアクセスするサブクエリまたはユーザー定義関数、あるいはそのようなアクセスを行うと想定されるサブクエリまたはユーザー定義関数。Subqueries or user-defined functions that perform user or system data access, or are assumed to perform such access. ユーザー定義関数は、スキーマ バインドでない場合、データ アクセスを行うと見なされます。User-defined functions are assumed to perform data access if they are not schema-bound.

  • 列が次のいずれかの方法で定義されている場合のビューまたはインライン テーブル値関数からの列。A column from a view or inline table-valued function when that column is defined by one of the following methods:

    • サブクエリ。A subquery.

    • ユーザー データやシステム データにアクセスするユーザー定義関数、またはそのようなアクセスを行うと想定されるユーザー定義関数A user-defined function that performs user or system data access, or is assumed to perform such access.

    • ユーザー データやシステム データにアクセスするユーザー定義関数を定義に含む計算列A computed column that contains a user-defined function that performs user or system data access in its definition.

      SQL ServerSQL Server が OUTPUT 句でそのような列を検出すると、エラー 4186 が発生します。When SQL ServerSQL Server detects such a column in the OUTPUT clause, error 4186 is raised.

OUTPUT 句から返されたデータのテーブルへの挿入Inserting Data Returned From an OUTPUT Clause Into a Table

入れ子になった INSERT、UPDATE、DELETE、または MERGE ステートメント内の OUTPUT 句の結果を取得して対象のテーブルに挿入する場合は、以下の点に注意してください。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:

  • この操作全体がアトミックです。The whole operation is atomic. INSERT ステートメントおよび OUTPUT 句を含んでいる入れ子になった DML ステートメントの両方が実行されるか、ステートメント全体が失敗します。Either both the INSERT statement and the nested DML statement that contains the OUTPUT clause execute, or the whole statement fails.

  • 外部の INSERT ステートメントの対象には次の制限が適用されます。The following restrictions apply to the target of the outer INSERT statement:

    • リモート テーブル、ビュー、または共通テーブル式を対象にすることはできません。The target cannot be a remote table, view, or common table expression.

    • 対象に FOREIGN KEY 制約を含めたり、対象を FOREIGN KEY 制約で参照することはできません。The target cannot have a FOREIGN KEY constraint, or be referenced by a FOREIGN KEY constraint.

    • 対象に対してトリガーを定義することはできません。Triggers cannot be defined on the target.

    • 対象を、マージ レプリケーションや、トランザクション レプリケーションの更新可能なサブスクリプションに加えることはできません。The target cannot participate in merge replication or updatable subscriptions for transactional replication.

  • 入れ子になった DML ステートメントには次の制限が適用されます。The following restrictions apply to the nested DML statement:

    • リモート テーブルまたはパーティション ビューを対象にすることはできません。The target cannot be a remote table or partitioned view.

    • ソース自体に <dml_table_source> 句を含めることはできません。The source itself cannot contain a <dml_table_source> clause.

  • OUTPUT INTO 句は、<dml_table_source> 句を含む INSERT ステートメントではサポートされません。The OUTPUT INTO clause is not supported in INSERT statements that contain a <dml_table_source> clause.

  • @@ROWCOUNT からは、外部の INSERT ステートメントによって挿入された行のみが返されます。@@ROWCOUNT returns the rows inserted only by the outer INSERT statement.

  • @@IDENTITY、SCOPE_IDENTITY、および IDENT_CURRENT は、入れ子になった DML ステートメントによって生成された ID 値のみを返し、外部の INSERT ステートメントによって生成された ID 値は返しません。@@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.

  • クエリ通知ではステートメントは単一のエンティティとして扱われ、作成されるメッセージの種類は入れ子になった DML の種類になります。これは、外部の INSERT ステートメント自体から大きな変更が加えられた場合でも同様です。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.

  • <dml_table_source> 句では、SELECT 句および WHERE 句に、サブクエリ、集計関数、順位付け関数、フルテキスト述語、データにアクセスするユーザー定義関数、または TEXTPTR 関数を含めることはできません。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.

ParallelismParallelism

結果をクライアントに返す OUTPUT 句は、常に直列プランを使用します。An OUTPUT clause that returns results to the client will always use a serial plan.

互換性レベル 130 以上に設定されたデータベースのコンテキストでは、INSERT...SELECT 操作で SELECT ステートメントに WITH (TABLOCK) ヒントが使用され、OUTPUT...INTO を使用して一時テーブルまたはユーザー テーブルに挿入された場合、サブツリーのコストに応じて、INSERT...SELECT のターゲット テーブルが並列処理の対象となります。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. OUTPUT INTO 句で参照されているターゲット テーブルは、並列処理の対象になりません。The target table referenced in the OUTPUT INTO clause will not be eligible for parallelism.

トリガーTriggers

OUTPUT から返される列は、INSERT ステートメント、UPDATE ステートメント、または DELETE ステートメントが完了した後、トリガーが実行される前のデータを反映します。Columns returned from OUTPUT reflect the data as it is after the INSERT, UPDATE, or DELETE statement has completed but before triggers are executed.

INSTEAD OF トリガーでは、トリガー操作の結果変更が行われない場合でも、INSERT、UPDATE、または DELETE が実際に行われたかのように返される結果が生成されます。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. OUTPUT 句を含むステートメントがトリガー本体の中で使用されている場合、トリガーの inserted テーブルおよび deleted テーブルを参照するためには、テーブルの別名を使用する必要があります。これにより、OUTPUT に関連付けられている INSERTED テーブルおよび DELETED テーブルで列参照が重複するのを避けることができます。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.

INTO キーワードを指定せずに OUTPUT 句を指定すると、DML 操作を行った先では、その DML アクションに対して定義されたトリガーを有効化できません。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. たとえば、UPDATE ステートメント内で OUTPUT 句が定義されていると、対象のテーブルで UPDATE トリガーを有効化できません。For example, if the OUTPUT clause is defined in an UPDATE statement, the target table cannot have any enabled UPDATE triggers.

sp_configure オプション disallow results from triggers が設定されている場合に、INTO 句なしの OUTPUT 句をトリガー内で呼び出すと、ステートメントが失敗します。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.

データ型Data Types

OUTPUT 句は、ラージ オブジェクト データ型 nvarchar(max)varchar(max)varbinary(max)textntextimage、および xml をサポートしています。The OUTPUT clause supports the large object data types: nvarchar(max), varchar(max), varbinary(max), text, ntext, image, and xml. UPDATE ステートメント内で .WRITE 句を使用して 、nvarchar(max)varchar(max)、または varbinary(max) の列を変更すると、参照されていれば、値の完全な前イメージと後イメージが返されます。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. TEXTPTR( ) 関数を、OUTPUT 句内の textntext、または image 列に対する式の一部として使用することはできません。The TEXTPTR( ) function cannot appear as part of an expression on a text, ntext, or image column in the OUTPUT clause.

キューQueues

OUTPUT を、テーブルをキューとして使用するアプリケーションで使用したり、中間結果セットを保持するために使用することができます。You can use OUTPUT in applications that use tables as queues, or to hold intermediate result sets. つまり、アプリケーションは、テーブルに対して、常に行の追加または削除を行っています。That is, the application is constantly adding or removing rows from the table. 次の例では、DELETE ステートメント内で OUTPUT 句を使用し、削除された行を呼び出し元アプリケーションに返します。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  

この例では、一度のアクションで、キューとして使用されているテーブルから行を削除し、削除された値を処理アプリケーションに返します。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. テーブルを使用したスタックの実装など、別のセマンティクスも実装できます。Other semantics may also be implemented, such as using a table to implement a stack. ただし、 SQL ServerSQL Server では、OUTPUT 句を使用した場合に DML ステートメントが行を処理する順序や返す順序は保証されません。However, SQL ServerSQL Server does not guarantee the order in which rows are processed and returned by DML statements using the OUTPUT clause. 必要なセマンティクスを保証する適切な WHERE 句を含むかどうかはアプリケーションに依存します。また、複数の行が DML 操作の対象となる場合には順序が保証されないという点に注意してください。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. 次の例では、必要な順序付けセマンティクスを実装するために、サブクエリを使用します。この例では、DatabaseLogID 列が一意であるということを前提にしています。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  

注意

複数のアプリケーションの同じテーブルへの破壊的な読み取りを許可する場合は、UPDATE ステートメントおよび DELETE ステートメントで READPAST テーブル ヒントを使用します。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. これにより、テーブル内の最初の該当レコードを別のアプリケーションが既に読み込み中である場合に発生するロックの問題が起こらなくなります。This prevents locking issues that can come up if another application is already reading the first qualifying record in the table.

アクセス許可Permissions

<dml_select_list> で取得する列や、<scalar_expression> で使用する列に対する SELECT 権限が必要です。SELECT permissions are required on any columns retrieved through <dml_select_list> or used in <scalar_expression>.

<output_table> で指定するテーブルに対する INSERT 権限が必要です。INSERT permissions are required on any tables specified in <output_table>.

使用例Examples

A.A. OUTPUT INTO を単純な INSERT ステートメントと共に使用するUsing OUTPUT INTO with a simple INSERT statement

次の例では、ScrapReason テーブルに 1 行を挿入し、OUTPUT 句を使用してステートメントの結果を @MyTableVar``table 変数に返します。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. ScrapReasonID 列が IDENTITY プロパティで定義されているため、INSERT ステートメントではこの列の値を指定していません。Because the ScrapReasonID column is defined with an IDENTITY property, a value is not specified in the INSERT statement for that column. ただし、 データベース エンジンDatabase Engine によってこの列用に生成された値が、OUTPUT 句で inserted.ScrapReasonID 列に返されます。However, note that the value generated by the データベース エンジンDatabase 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. OUTPUT を DELETE ステートメントと共に使用するUsing OUTPUT with a DELETE statement

次の例では、ShoppingCartItem テーブル内のすべての行を削除します。The following example deletes all rows in the ShoppingCartItem table. OUTPUT deleted.* 句は、DELETE ステートメントの結果 (つまり削除された行のすべての列) を、呼び出し元アプリケーションに返すことを指定します。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. 後続の SELECT ステートメントは、ShoppingCartItem テーブルへの削除操作の結果を確認します。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. OUTPUT INTO を UPDATE ステートメントと共に使用するUsing OUTPUT INTO with an UPDATE statement

次の例では、VacationHours テーブル内の最初の 10 個の行について、Employee 列を 25% 増しに更新します。The following example updates the VacationHours column in the Employee table by 25 percent for the first 10 rows. OUTPUT 句は、VacationHours を適用する前の UPDATE 列の deleted.VacationHours の値と、inserted.VacationHours 列の更新後の値を @MyTableVar テーブル変数に返します。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.

この後に、SELECT 内の値、および @MyTableVar テーブルの更新操作の結果を返す 2 つの Employee ステートメントが続きます。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. OUTPUT INTO を使用して式を返すUsing OUTPUT INTO to return an expression

次の例は例 C を基に構築され、更新後の VacationHours の値と更新が適用される前の VacationHours の値の差として、OUTPUT 句の中で式を定義しています。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. この式の値は、VacationHoursDifference 列の @MyTableVar``table 変数に返されます。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. OUTPUT INTO を UPDATE ステートメント内で from_table_name と共に使用するUsing OUTPUT INTO with from_table_name in an UPDATE statement

次の例は、WorkOrder テーブルの ScrapReasonID 列の、指定された ProductIDScrapReasonID を持つすべての作業指示を更新します。The following example updates the ScrapReasonID column in the WorkOrder table for all work orders with a specified ProductID and ScrapReasonID. OUTPUT INTO 句は、更新するテーブルの値 (WorkOrder) と、Product テーブルの値を返します。The OUTPUT INTO clause returns values from the table being updated (WorkOrder) and also from the Product table. 更新する行を指定するために、Product テーブルを FROM 句の中で使用します。The Product table is used in the FROM clause to specify the rows to update. WorkOrder テーブルには AFTER UPDATE トリガーが定義されているため、INTO キーワードが必要です。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. OUTPUT INTO を DELETE ステートメント内で from_table_name と共に使用するUsing OUTPUT INTO with from_table_name in a DELETE statement

次の例では、ProductProductPhoto テーブルの行を、FROM ステートメントの DELETE 句内で定義された検索条件に基づいて削除します。The following example deletes rows in the ProductProductPhoto table based on search criteria defined in the FROM clause of DELETE statement. OUTPUT 句は削除するテーブルの各列 (deleted.ProductIDdeleted.ProductPhotoID) と、Product テーブルの列を返します。The OUTPUT clause returns columns from the table being deleted (deleted.ProductID, deleted.ProductPhotoID) and columns from the Product table. このテーブルは、削除する行を指定するために FROM 句内で使用します。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. OUTPUT INTO をラージ オブジェクト データ型と共に使用するUsing OUTPUT INTO with a large object data type

次の例では、DocumentSummary テーブル内の nvarchar(max) 列である Production.Document の部分的な値を、.WRITE 句を使用して更新します。The following example updates a partial value in DocumentSummary, an nvarchar(max) column in the Production.Document table, by using the .WRITE clause. 置換する語、既存データ内で置換される語の開始位置 (オフセット)、置換する文字数 (長さ) を指定することにより、components という語が、features という語で置換されます。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). またこの例では、OUTPUT 句を使用して、DocumentSummary 列の前イメージと後イメージを @MyTableVar``table 変数に返します。The example uses the OUTPUT clause to return the before and after images of the DocumentSummary column to the @MyTableVar``table variable. DocumentSummary 列の完全な前イメージと後イメージが返される点に注意してください。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. OUTPUT を INSTEAD OF トリガー内で使用するUsing OUTPUT in an INSTEAD OF trigger

次の例では、トリガー内で OUTPUT 句を使用し、トリガー操作の結果を返しています。The following example uses the OUTPUT clause in a trigger to return the results of the trigger operation. まず、ScrapReason テーブルでビューを作成し、次にそのビューに対して INSTEAD OF INSERT トリガーを定義して、ユーザーがベース テーブルの Name 列しか変更できないようにします。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. ScrapReasonID はベース テーブルの IDENTITY 列であるため、トリガーはユーザーが指定した値を無視します。Because the column ScrapReasonID is an IDENTITY column in the base table, the trigger ignores the user-supplied value. これにより、 データベース エンジンDatabase Engineは正しい値を自動的に生成できるようになります。This allows the データベース エンジンDatabase Engine to automatically generate the correct value. また、ユーザーが ModifiedDate に指定した値も無視され、現在の日付が設定されます。Also, the value supplied by the user for ModifiedDate is ignored and is set to the current date. OUTPUT 句は、ScrapReason テーブルに実際に挿入された値を返します。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  

以下に、2004 年 4 月 12 日 ('2004-04-12') に生成された結果セットを示します。Here is the result set generated on April 12, 2004 ('2004-04-12'). ScrapReasonIDActual 列と ModifiedDate 列では、INSERT ステートメントで指定された値ではなく、トリガー操作で生成された値が反映されていることに注意してください。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. OUTPUT INTO を、ID 列および計算列と共に使用するUsing OUTPUT INTO with identity and computed columns

次の例では、EmployeeSales テーブルを作成し、INSERT ステートメントを使用してこのテーブルに複数行を挿入します。基になるテーブルからデータを取得するために、SELECT ステートメントも使用します。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. EmployeeSales テーブルには、ID 列 (EmployeeID) および計算列 (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. OUTPUT と OUTPUT INTO を単一のステートメント内で使用するUsing OUTPUT and OUTPUT INTO in a single statement

次の例では、ProductProductPhoto テーブルの行を、FROM ステートメントの DELETE 句内で定義された検索条件に基づいて削除します。The following example deletes rows in the ProductProductPhoto table based on search criteria defined in the FROM clause of DELETE statement. OUTPUT INTO 句は削除するテーブルの各列 (deleted.ProductIDdeleted.ProductPhotoID) と、Product テーブルの列を、@MyTableVar``table 変数に返します。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. Product テーブルは、削除する行を指定するために FROM 句内で使用します。The Product table is used in the FROM clause to specify the rows to delete. OUTPUT 句は、deleted.ProductID 列、deleted.ProductPhotoID 列、および ProductProductPhoto テーブルから行を削除した日付と時刻を、呼び出し元アプリケーションに返します。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. OUTPUT 句から返されたデータを挿入するInserting data returned from an OUTPUT clause

次の例では、OUTPUT ステートメントの MERGE 句から返されたデータをキャプチャし、そのデータを別のテーブルに挿入します。The following example captures data returned from the OUTPUT clause of a MERGE statement, and inserts that data into another table. MERGE ステートメントは、Quantity テーブル内で処理された注文に基づいて、ProductInventory テーブルの SalesOrderDetail 列を毎日更新します。The MERGE statement updates the Quantity column of the ProductInventory table daily, based on orders that are processed in the SalesOrderDetail table. また、在庫が 0 以下になった製品の行を削除します。It also deletes rows for products whose inventories drop to 0 or below. この例では、削除された行をキャプチャし、在庫がない製品を追跡する別のテーブル ZeroInventory に挿入します。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;  

参照See Also

DELETE (Transact-SQL) DELETE (Transact-SQL)
INSERT (Transact-SQL) INSERT (Transact-SQL)
UPDATE (Transact-SQL) UPDATE (Transact-SQL)
テーブル (Transact-SQL) table (Transact-SQL)
CREATE TRIGGER (Transact-SQL) CREATE TRIGGER (Transact-SQL)
sp_configure (Transact-SQL)sp_configure (Transact-SQL)