次の方法で共有


@@IDENTITY(Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric の SQL データベース

@@IDENTITY は最後に挿入された恒等元値を返すシステム関数です。

Transact-SQL 構文表記規則

構文

@@IDENTITY  

戻り値の型

numeric(38,0)

解説

INSERTSELECT INTO、または一括コピー文が完了した後、@@IDENTITY文によって生成される最後の識別値が格納されます。

  • 文が識別列を持つテーブルに影響しなければ、 @@IDENTITYNULLを返します。
  • 複数の行を挿入して複数の単位元値を生成する場合、 @@IDENTITY は最後に生成された単位元値を返します。
  • 文が1つ以上のトリガーを発生させて識別値を生成する挿入を行う場合、文の直後に @@IDENTITY を呼び出すとトリガーによって生成された最後の識別値が返されます。
  • 識別列を持つテーブルで挿入アクションの後にトリガーが発生し、そのトリガーが識別列のない別のテーブルに挿入された場合、 @@IDENTITY 最初の挿入の識別値が返されます。 INSERT文やSELECT INTO文、または一括コピーが失敗した場合、またはトランザクションがロールバックされても、@@IDENTITY値は以前の設定に戻ることはありません。

失敗したステートメントとトランザクションによって、テーブルに対する現在の ID が変更され、ID 列値に差異が生じる可能性があります。 ID 値がロールバックされることはありません。これは、テーブルに値を挿入するトランザクションがコミットされない場合でも同じです。 例えば、INSERT文が IGNORE_DUP_KEY 違反で失敗した場合、テーブルの現在の識別値は依然として増加します。

@@IDENTITYSCOPE_IDENTITYIDENT_CURRENT は、いずれもテーブルの IDENTITY 列に挿入された最後の値を返すため、似た関数です。

  • @@IDENTITY SCOPE_IDENTITY 現在のセッション内の任意のテーブルで生成された最後の識別子値を返します。 しかし、 SCOPE_IDENTITY 値は現在のスコープ内でのみ返されます。 @@IDENTITY 特定のスコープに限定されるわけではありません。

  • IDENT_CURRENT 範囲や会期に制限されません。指定されたテーブルに限定されます。 IDENT_CURRENT 任意のセッションおよびスコープで特定のテーブルに対して生成された識別値を返します。 詳しくは、「IDENT_CURRENT (Transact-SQL)」をご覧ください。

@@IDENTITY関数のスコープは、実行されるローカルサーバー上の現在のセッションです。 この関数は、リモート サーバーまたはリンク サーバーには適用できません。 別のサーバーで ID 値を取得するには、そのリモート サーバーまたはリンク サーバーでストアド プロシージャを実行し、(リモート サーバーまたはリンク サーバーのコンテキスト内で実行されている) そのストアド プロシージャが ID 値を収集し、ローカル サーバー上の呼び出し元の接続にこれを返すようにします。

レプリケーションはレプリケーショントリガーやストアドプロシージャ内で使用されるため、 @@IDENTITY 値に影響を与えることがあります。 @@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