IDENT_CURRENT('tableName') は、任意のセッション、任意のスコープの特定のテーブルに対して生成された最後のID値を返します。 これにより、上記の2つが必要としているものではない場合(非常に稀)に、どのテーブルから値を得るかを指定することができます。 また、@Guy Starbuckが述べているように、"You could use this if you want to get the current IDENTITY value for a table that you have been inserted a record into." (レコードを挿入していないテーブルの現在のIDENTITY値を取得したい場合に、これを使用することができます)。
@IDENTITY
は、現在のセッションの任意のテーブルに対して生成された最後のID値を、すべてのスコープにわたって返します。 **ここで注意しなければならないのは、スコープを越えているということです。 現在のステートメントではなく、トリガーから値を取得することもできます。SCOPE_IDENTITY()
は、現在のセッションと現在のスコープ内の任意のテーブルに対して生成された最後のID値を返します。 一般的に使用したいものです。IDENT_CURRENT('tableName')
は、任意のセッション、任意のスコープの特定のテーブルに対して生成された最後のID値を返します。 これにより、上記の2つが必要としているものではない場合(非常に稀)に、どのテーブルから値を得るかを指定することができます。 また、@Guy Starbuckが述べているように、"You could use this if you want to get the current IDENTITY value for a table that you have been inserted a record into." (レコードを挿入していないテーブルの現在のIDENTITY値を取得したい場合に、これを使用することができます)。INSERT
文の[
OUTPUT`句]5を使うと、その文で挿入されたすべての行にアクセスできます。 特定のステートメントにスコープされているので、上記の他の関数よりも わかりやすい です。 しかし、これは少し冗長で(テーブル変数/テンプテーブルに挿入し、それをクエリする必要があります)、ステートメントがロールバックされるエラーシナリオでも結果が得られます。 とはいえ、クエリが並列実行プランを使用している場合、これは(並列処理をオフにしない限り)IDを取得するための唯一の保証された方法です。しかし、この方法はトリガーの前に実行されるため、トリガーで生成された値を返すためには使用できません。MSDNを参照してください。
IDENTITYは、現在のSQL接続を使用して最後に挿入されたIDです。 これは、新しいレコードのために挿入されたIDが必要なだけで、その後に行が追加されたかどうかは気にしない、挿入ストアド・プロシージャから返すのに適した値です。
SCOPE_IDENTITYは、現在のSQL接続を使用して、現在のスコープで最後に挿入されたIDです。つまり、挿入後にトリガに基づいて2番目のIDが挿入された場合、それはSCOPE_IDENTITYには反映されず、実行した挿入のみが反映されます。正直なところ、これを使う理由はありません。
IDENT_CURRENT(tablename)は、接続やスコープに関係なく、最後に挿入されたIDです。 これは、レコードを挿入していないテーブルの現在のIDENTITY値を取得したい場合に使用できます。