SCOPE_IDENTITY、IDENT_CURRENT、および @@IDENTITY は、ID 列に挿入された値を返すという点で似ています。
IDENT_CURRENT はスコープとセッションには限定されませんが、特定のテーブルに限定されます。IDENT_CURRENT では、任意のセッションとスコープ内の特定のテーブルに対して生成された値が返されます。詳細については、「IDENT_CURRENT (Transact-SQL)」を参照してください。
SCOPE_IDENTITY と @@IDENTITY では、現在のセッション内の任意のテーブルで生成された最後の ID 値が返されます。ただし、SCOPE_IDENTITY で返される値は、現在のスコープ内で挿入された値に限られます。@@IDENTITY の場合は、特定のスコープに限定されません。
たとえば、T1 と T2 の 2 つのテーブルがあるとし、INSERT トリガが T1 で定義されているとします。T1 に行が挿入されると、トリガが起動し、T2 に行を挿入します。このシナリオでは、T1 上での挿入と、トリガの結果として得られる T2 上での挿入という、2 つのスコープがあります。
T1 と T2 の両方に ID 列がある場合、T1 上で INSERT ステートメントが終了すると、@@IDENTITY と SCOPE_IDENTITY によってそれぞれ異なる値が返されます。@@IDENTITY では、現在のセッションの任意のスコープにおいて挿入された最後の ID 列の値が返されます。これは、T2 で挿入された値です。SCOPE_IDENTITY() では、T1 に挿入された IDENTITY 値が返されます。これは、同じスコープ内で発生した最後の挿入です。ID 列への INSERT ステートメントがスコープ内で発生する前に SCOPE_IDENTITY() 関数が起動された場合、この関数では NULL 値が返されます。
失敗したステートメントとトランザクションによって、テーブルに対する現在の ID が変更され、ID 列値に差異が生じる可能性があります。ID 値がロールバックされることはありません。これは、テーブルに値を挿入するトランザクションがコミットされない場合でも同じです。たとえば、INSERT ステートメントが IGNORE_DUP_KEY 違反のために失敗しても、テーブルの現在の ID 値は増分されます。