読者です 読者をやめる 読者になる 読者になる

checkpoint

自分用のIT技術系ノートです。古い情報や間違っている情報もあるので注意。

Identity値を取得する3つの方法

SQL Serverで主キーなんかに使う型でIdentityってありますよね?
IDとして自動的に連番を振り出してくれるヤツ。

自動的に付与される値なので(普通は)明示的に指定することができません。
行を登録した後に取得することになりますが、その際に利用できる構文が3つあります。


それぞれ以下の条件において最後に振り出されたIdentity値を取得します。


  • @@IDENTITY

セッション:実行したセッション
スコープ:全てのスコープ
テーブル:全てのテーブル

SELECT @@IDENTITY
  • SCOPE_IDENTITY

セッション:実行したセッション
スコープ:実行したスコープ
テーブル:全てのテーブル

SELECT SCOPE_IDENTITY()
  • IDENT_CURRENT

セッション:全てのセッション
スコープ:全てのスコープ
テーブル:指定したテーブル

SELECT IDENT_CURRENT('テーブル名')

スコープというのはストアド、トリガ、関数、バッチなどのひとかたまりを言います。
@@IDENTITYを利用している場合は「全てのスコープ」が対象となるため、テーブル更新によってトリガなどが起動し、別テーブルのIdentity値が更新されてしまうと、そちらの方が取得されてしまいます。


正直、一度これでハマったので「IDENT_CURRENTを利用してテーブルを明示する」という方法に変えたのです。
しかしよく考えたらこちらは「全てのセッション」が対象になるため、別々のセッションのトランザクションが並列に走った場合、取得される値がどちらか一方のものになってしまう可能性があります。(多分可能性は低いでしょうが)


なので「Identityを含むテーブルに行を登録し、すぐ値を取得する」というケースの場合はSCOPE_IDENTITYを利用するのがベストです。


Identity値を取得する場合は3種類の違いに気をつけて使い分けましょう。