@@IDENTITY (Transact-SQL)
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance
最後に挿入された ID 値を返すシステム関数です。
構文
@@IDENTITY
戻り値の型
numeric(38,0)
解説
INSERT、SELECT INTO、または一括コピーの各ステートメントが終了すると、@@IDENTITY には、ステートメントによって最後に生成された ID 値が含められます。 ID 列のあるテーブルがステートメントによって影響されなかった場合、@@IDENTITY は NULL 値を返します。 複数の行を挿入して、複数の ID 値を生成する場合、@@IDENTITY では最後に生成された ID 値を返します。 ステートメントで、ID 値を生成する挿入を実行する 1 つ以上のトリガーを起動する場合、このステートメントの直後で @@IDENTITY を呼び出すと、トリガーにより最後に生成された ID 値が返されます。 ID 列のあるテーブルでの挿入アクション後に起動されるトリガーによって、ID 列のない別のテーブルへの挿入が実行される場合、@@IDENTITY では最初の挿入の ID 値を返します。 INSERT ステートメントか SELECT INTO ステートメント、または一括コピーが失敗した場合、あるいは、トランザクションがロールバックされた場合、@@IDENTITY 値は前の設定に戻りません。
失敗したステートメントとトランザクションによって、テーブルに対する現在の ID が変更され、ID 列値に差異が生じる可能性があります。 ID 値がロールバックされることはありません。これは、テーブルに値を挿入するトランザクションがコミットされない場合でも同じです。 たとえば、INSERT ステートメントが IGNORE_DUP_KEY 違反のために失敗しても、テーブルの現在の ID 値は増分されます。
@@IDENTITY、SCOPE_IDENTITY、および IDENT_CURRENT は、すべてテーブルの IDENTITY 列に最後に挿入された値を返すという点で似ています。
@@IDENTITY と SCOPE_IDENTITY は、現在のセッション内の任意のテーブルで生成された最後の ID 値を返します。 ただし、SCOPE_IDENTITY で返すのは、現在のスコープ内の値に限られます。@@IDENTITY の場合は、特定のスコープに限定されません。
IDENT_CURRENT はスコープとセッションには限定されませんが、特定のテーブルに限定されます。 IDENT_CURRENT は、任意のセッションおよび任意のスコープ内の特定のテーブルに対して生成された ID 値を返します。 詳しくは、「IDENT_CURRENT (Transact-SQL)」をご覧ください。
@@IDENTITY 関数のスコープは、実行されるローカル サーバーの現在のセッションです。 この関数は、リモート サーバーまたはリンク サーバーには適用できません。 別のサーバーで ID 値を取得するには、そのリモート サーバーまたはリンク サーバーでストアド プロシージャを実行し、(リモート サーバーまたはリンク サーバーのコンテキスト内で実行されている) そのストアド プロシージャが ID 値を収集し、ローカル サーバー上の呼び出し元の接続にこれを返すようにします。
@@IDENTITY の値はレプリケーション トリガーやストアド プロシージャ内で使用されるため、レプリケーションによって影響を受けることがあります。 列がレプリケーション アーティクルの一部である場合、ユーザーが作成した最新の ID として @@IDENTITY を信頼することはできません。 @@IDENTITY の代わりに、SCOPE_IDENTITY() 関数の構文を使用できます。 詳細については、「SCOPE_IDENTITY (Transact-SQL)」を参照してください
Note
呼び出し元のストアド プロシージャまたは Transact-SQL ステートメントは、レプリケーションで使用する入れ子になったトリガーのスコープ内での ID ではなく、そのユーザーのステートメントのスコープ内で使用される最新の ID を返す SCOPE_IDENTITY()
関数を使用するように書き直す必要があります。
例
次の例では、ID 列 (LocationID
) のあるテーブルに行を挿入し、@@IDENTITY
を使用して新しい行で使用する ID 値を表示します。
USE AdventureWorks2022;
GO
--Display the value of LocationID in the last row in the table.
SELECT MAX(LocationID) FROM Production.Location;
GO
INSERT INTO Production.Location (Name, CostRate, Availability, ModifiedDate)
VALUES ('Damaged Goods', 5, 2.5, GETDATE());
GO
SELECT @@IDENTITY AS 'Identity';
GO
--Display the value of LocationID of the newly inserted row.
SELECT MAX(LocationID) FROM Production.Location;
GO
参照
システム関数 (Transact-SQL)
CREATE TABLE (Transact-SQL)
IDENT_CURRENT (Transact-SQL)
INSERT (Transact-SQL)
SCOPE_IDENTITY (Transact-SQL)
SELECT (Transact-SQL)