insertした行(要素)のIDを取得する

Transact-SQLでinsertした要素のIDを取得するSQLを紹介します。

概要

Transact-SQLでは挿入した要素のIDはSCOPE_IDENTITY, @@IDENTITY で取得できます。 通常の利用ではSCOPE_IDENTITYを利用します。

SCOPE_IDENTITY

SCOPE_IDENTITY を用いる場合です。

insert into products (name, pricce) values ('Penguin', 230);
select insertID = SCOPE_IDENTITY();

動作

  • 同じセッション・同じスコープ内で最後に生成された IDENTITY 値を返します。(ストアドプロシージャ、トリガー は別スコープとみなします)
  • トリガーで他テーブルの INSERT が走っても元のテーブルの ID を拾えます

@@IDENTITY

@@IDENTITYを用いる場合です。

insert into products (name, pricce) values ('Penguin', 230);
select insertID = @@IDENTITY;

動作

  • 同じセッション内で「最後に生成された IDENTITY 値」を返します
  • スコープ(バッチ/プロシージャ/トリガー)を問わないです
  • トリガーで別テーブルに INSERT が走った場合、そのテーブルの ID になる可能性がある点に注意が必要です
注意点
  • トリガーが INSERT した場合、元の INSERT の ID ではなくトリガーで生成された ID を返すことがあります
  • 同一セッション内であればどのテーブルの ID でも返すため、意図しない結果になる場合があります

IDENT_CURRENT

IDENT_CURRENTを用いる方法もあります。

IDENT_CURRENT( 'table_name' )
insert into products (name, pricce) values ('Penguin', 230);
select insertID = IDENT_CURRENT ('Products');

動作

  • 特定のテーブルに対して最後に生成された IDENTITY 値を返します
  • セッションやスコープを問わず、他の接続でも生成された ID も含みます
注意点
  • 同時に他のユーザーが insert している状況だと予期せぬ値を返す可能性があります
  • 「直前の INSERT の値」ではなく単純にそのテーブルの最新 ID を返します
AuthorPortraitAlt
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
作成日: 2012-09-02