SCOPE_IDENTITY (Transact-SQL)SCOPE_IDENTITY (Transact-SQL)

適用対象: ○SQL Server ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

同じスコープ内の ID 列に挿入された最後の ID 値を返します。Returns the last identity value inserted into an identity column in the same scope. スコープは、ストアド プロシージャ、トリガー、関数、バッチのいずれかのモジュールです。A scope is a module: a stored procedure, trigger, function, or batch. したがって、2 つのステートメントが同じストアド プロシージャ、関数、またはバッチ内にある場合、これらのステートメントのスコープは同じになります。Therefore, if two statements are in the same stored procedure, function, or batch, they are in the same scope.

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

構文Syntax

SCOPE_IDENTITY()  

戻り値の型Return Types

numeric(38,0)numeric(38,0)

RemarksRemarks

SCOPE_IDENTITY、IDENT_CURRENT、および @@IDENTITY は、ID 列に挿入された値を返すという点で似ています。SCOPE_IDENTITY, IDENT_CURRENT, and @@IDENTITY are similar functions because they return values that are inserted into identity columns.

IDENT_CURRENT はスコープとセッションには限定されませんが、特定のテーブルに限定されます。IDENT_CURRENT is not limited by scope and session; it is limited to a specified table. IDENT_CURRENT では、任意のセッションとスコープ内の特定のテーブルに対して生成された値が返されます。IDENT_CURRENT returns the value generated for a specific table in any session and any scope. 詳細については、を参照してください。 IDENT_CURRENT (& a) #40 です。TRANSACT-SQL と #41;.For more information, see IDENT_CURRENT (Transact-SQL).

SCOPE_IDENTITY と @@IDENTITY では、現在のセッション内の任意のテーブルで生成された最後の ID 値が返されます。SCOPE_IDENTITY and @@IDENTITY return the last identity values that are generated in any table in the current session. ただし、SCOPE_IDENTITY で返される値は、現在のスコープ内で挿入された値に限られます。@@IDENTITY の場合は、特定のスコープに限定されません。However, SCOPE_IDENTITY returns values inserted only within the current scope; @@IDENTITY is not limited to a specific scope.

たとえば、T1 と T2 の 2 つのテーブルがあるとし、INSERT トリガーが T1 で定義されているとします。For example, there are two tables, T1 and T2, and an INSERT trigger is defined on T1. T1 に行が挿入されると、トリガーが起動し、T2 に行を挿入します。When a row is inserted to T1, the trigger fires and inserts a row in T2. このシナリオでは、T1 上での挿入と、トリガーの結果として得られる T2 上での挿入という、2 つのスコープがあります。This scenario illustrates two scopes: the insert on T1, and the insert on T2 by the trigger.

T1 と T2 の両方に ID 列がある場合、T1 上で INSERT ステートメントが終了すると、@@IDENTITY と SCOPE_IDENTITY によってそれぞれ異なる値が返されます。Assuming that both T1 and T2 have identity columns, @@IDENTITY and SCOPE_IDENTITY return different values at the end of an INSERT statement on T1. @@IDENTITY では、現在のセッションの任意のスコープにおいて挿入された最後の ID 列の値が返されます。@@IDENTITY returns the last identity column value inserted across any scope in the current session. これは、T2 で挿入された値です。This is the value inserted in T2. SCOPE_IDENTITY() では、T1 に挿入された IDENTITY 値が返されます。SCOPE_IDENTITY() returns the IDENTITY value inserted in T1. これは、同じスコープ内で発生した最後の挿入です。This was the last insert that occurred in the same scope. ID 列への INSERT ステートメントがスコープ内で発生する前に SCOPE_IDENTITY() 関数が呼び出された場合、この関数では NULL 値が返されます。The SCOPE_IDENTITY() function returns the null value if the function is invoked before any INSERT statements into an identity column occur in the scope.

失敗したステートメントとトランザクションによって、テーブルに対する現在の ID が変更され、ID 列値に差異が生じる可能性があります。Failed statements and transactions can change the current identity for a table and create gaps in the identity column values. ID 値がロールバックされることはありません。これは、テーブルに値を挿入するトランザクションがコミットされない場合でも同じです。The identity value is never rolled back even though the transaction that tried to insert the value into the table is not committed. たとえば、INSERT ステートメントが IGNORE_DUP_KEY 違反のために失敗しても、テーブルの現在の ID 値は増分されます。For example, if an INSERT statement fails because of an IGNORE_DUP_KEY violation, the current identity value for the table is still incremented.

使用例Examples

A.A. @@IDENTITY および SCOPE_IDENTITY をトリガーで使用するUsing @@IDENTITY and SCOPE_IDENTITY with triggers

次の例では、TZTY の 2 つのテーブルを作成し、TZ に INSERT トリガーを作成します。The following example creates two tables, TZ and TY, and an INSERT trigger on TZ. テーブル TZ に行が挿入されると、トリガー (Ztrig) が起動し、TY に行が挿入されます。When a row is inserted to table TZ, the trigger (Ztrig) fires and inserts a row in TY.

USE tempdb;  
GO  
CREATE TABLE TZ (  
   Z_id  int IDENTITY(1,1)PRIMARY KEY,  
   Z_name varchar(20) NOT NULL);  
  
INSERT TZ  
   VALUES ('Lisa'),('Mike'),('Carla');  
  
SELECT * FROM TZ;  

次に結果セットを示します。次に示すのはテーブル TZ の内容です。Result set: This is how table TZ looks.

Z_id   Z_name  
-------------  
1      Lisa  
2      Mike  
3      Carla  
CREATE TABLE TY (  
   Y_id  int IDENTITY(100,5)PRIMARY KEY,  
   Y_name varchar(20) NULL);  
  
INSERT TY (Y_name)  
   VALUES ('boathouse'), ('rocks'), ('elevator');  
  
SELECT * FROM TY;  

次に結果セットを示します。次に示すのは TY の内容です。Result set: This is how TY looks:

Y_id  Y_name  
---------------  
100   boathouse  
105   rocks  
110   elevator  

行がテーブル TZ に挿入されるとテーブル TY に行を挿入するトリガーを作成します。Create the trigger that inserts a row in table TY when a row is inserted in table TZ.

CREATE TRIGGER Ztrig  
ON TZ  
FOR INSERT AS   
   BEGIN  
   INSERT TY VALUES ('')  
   END;  

トリガーを起動し、@@IDENTITY および SCOPE_IDENTITY 関数で取得した ID 値を確認します。FIRE the trigger and determine what identity values you obtain with the @@IDENTITY and SCOPE_IDENTITY functions.

INSERT TZ VALUES ('Rosalie');  
  
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  
GO  
SELECT @@IDENTITY AS [@@IDENTITY];  
GO  

以下に結果セットを示します。Here is the result set.

/*SCOPE_IDENTITY returns the last identity value in the same scope. This was the insert on table TZ.*/`  
SCOPE_IDENTITY  
4  

/*@@IDENTITY returns the last identity value inserted to TY by the trigger. 
  This fired because of an earlier insert on TZ.*/
@@IDENTITY  
115  

B.B. @@IDENTITY および SCOPE_IDENTITY() をレプリケーションで使用するUsing @@IDENTITY and SCOPE_IDENTITY() with replication

次の例は、マージ レプリケーション用にパブリッシュされたデータベースへの挿入で、@@IDENTITY および SCOPE_IDENTITY() を使用する方法を示しています。The following examples show how to use @@IDENTITY and SCOPE_IDENTITY() for inserts in a database that is published for merge replication. 例のテーブルは両方とも AdventureWorks2012AdventureWorks2012 サンプル データベースにあります。Person.ContactType はパブリッシュされておらず、Sales.Customer はパブリッシュされています。Both tables in the examples are in the AdventureWorks2012AdventureWorks2012 sample database: Person.ContactType is not published, and Sales.Customer is published. マージ レプリケーションでは、パブリッシュされたテーブルにトリガーを追加します。Merge replication adds triggers to tables that are published. このため、@@IDENTITY では、値をユーザー テーブルに挿入する代わりにレプリケーション システム テーブルに挿入して返すことができます。Therefore, @@IDENTITY can return the value from the insert into a replication system table instead of the insert into a user table.

Person.ContactType テーブルの ID の最大値は 20 です。The Person.ContactType table has a maximum identity value of 20. このテーブルに行を挿入する場合、@@IDENTITYSCOPE_IDENTITY() は同じ値を返します。If you insert a row into the table, @@IDENTITY and SCOPE_IDENTITY() return the same value.

USE AdventureWorks2012;  
GO  
INSERT INTO Person.ContactType ([Name]) VALUES ('Assistant to the Manager');  
GO  
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  
GO  
SELECT @@IDENTITY AS [@@IDENTITY];  
GO  

以下に結果セットを示します。Here is the result set.

SCOPE_IDENTITY  
21  
@@IDENTITY  
21

Sales.Customer テーブルの ID の最大値は 29483 です。The Sales.Customer table has a maximum identity value of 29483. このテーブルに行を挿入する場合、@@IDENTITYSCOPE_IDENTITY() は異なる値を返します。If you insert a row into the table, @@IDENTITY and SCOPE_IDENTITY() return different values. SCOPE_IDENTITY() は値をユーザー テーブルに挿入して返すのに対し、@@IDENTITY は値をレプリケーション システム テーブルに挿入して返します。SCOPE_IDENTITY() returns the value from the insert into the user table, whereas @@IDENTITY returns the value from the insert into the replication system table. 挿入した ID 値にアクセスする必要があるアプリケーションには、SCOPE_IDENTITY() を使用してください。Use SCOPE_IDENTITY() for applications that require access to the inserted identity value.

INSERT INTO Sales.Customer ([TerritoryID],[PersonID]) VALUES (8,NULL);  
GO  
SELECT SCOPE_IDENTITY() AS [SCOPE_IDENTITY];  
GO  
SELECT @@IDENTITY AS [@@IDENTITY];  
GO  

以下に結果セットを示します。Here is the result set.

SCOPE_IDENTITY  
29484  
@@IDENTITY  
89

参照See Also

@@IDENTITY (Transact-SQL)@@IDENTITY (Transact-SQL)