SQL Serverでは、ID列に作成された値を返す必要がある場合は、いくつかのオプションがあります。これらの各オプションは似ていますが、わずかに異なることを行います。
特に、次の機能を使用できます。
-
IDENT_CURRENT()
指定されたテーブルに対して最後に挿入されたID値を返します。 -
SCOPE_IDENTITY()
anyのID列に挿入された最後のID値を返します 現在のセッションと現在のスコープのテーブル。 -
@@IDENTITY
anyで最後に挿入されたID値を返します スコープに関係なく、現在のセッションのテーブル。
例
これら3つの機能の違いを示す例を次に示します。
まず、2つのテーブルを作成します。各テーブルのID列に使用されているシード値と増分値が異なることに注意してください。
CREATE TABLE t1(id int IDENTITY(1,1)); CREATE TABLE t2(id int IDENTITY(150,10));
次に、行が最初のテーブルに挿入されるたびに2番目のテーブルに行を挿入するトリガーを作成します。
CREATE TRIGGER t1_insert_trigger ON t1 FOR INSERT AS BEGIN INSERT t2 DEFAULT VALUES END;
トリガーは別のスコープで起動するため、ここでの私の例に最適です。
最初のテーブルにデータを挿入し、両方のテーブルから結果を選択します。
INSERT t1 DEFAULT VALUES; SELECT id AS t1 FROM t1; SELECT id AS t2 FROM t2;
結果:
+------+ | t1 | |------| | 1 | +------+ (1 row affected) +------+ | t2 | |------| | 150 | +------+ (1 row affected)
したがって、明確にするために、このデータは2つの異なるスコープによって挿入されました。 t1への挿入 現在のスコープによって行われました。 t2への挿入 別のスコープで実行されたトリガーによって実行されました。
次に、前述の機能から選択しましょう:
SELECT @@IDENTITY AS [@@IDENTITY], SCOPE_IDENTITY() AS [SCOPE_IDENTITY()], IDENT_CURRENT('t1') AS [IDENT_CURRENT('t1')], IDENT_CURRENT('t2') AS [IDENT_CURRENT('t2')];
結果:
+--------------+--------------------+-----------------------+-----------------------+ | @@IDENTITY | SCOPE_IDENTITY() | IDENT_CURRENT('t1') | IDENT_CURRENT('t2') | |--------------+--------------------+-----------------------+-----------------------| | 150 | 1 | 1 | 150 | +--------------+--------------------+-----------------------+-----------------------+
@@IDENTITY
によって返される結果 スコープに限定されないため、スコープに関係なく、最後に挿入されたID値を返します。
SCOPE_IDENTITY()
最初のテーブルからID値を返します。これは、現在のスコープ内で最後に挿入されたID値であるためです(トリガーは現在のスコープ外にあります)。
IDENT_CURRENT()
関数は、スコープやセッションに関係なく、指定されたテーブルに挿入された最後のID値を返すだけです。
新しいセッションを開く
ここで、新しいセッションを開いて前のステートメントを再度実行するとどうなりますか。
USE Test; SELECT @@IDENTITY AS [@@IDENTITY], SCOPE_IDENTITY() AS [SCOPE_IDENTITY()], IDENT_CURRENT('t1') AS [IDENT_CURRENT('t1')], IDENT_CURRENT('t2') AS [IDENT_CURRENT('t2')];
結果:
+--------------+--------------------+-----------------------+-----------------------+ | @@IDENTITY | SCOPE_IDENTITY() | IDENT_CURRENT('t1') | IDENT_CURRENT('t2') | |--------------+--------------------+-----------------------+-----------------------| | NULL | NULL | 1 | 150 | +--------------+--------------------+-----------------------+-----------------------+
両方の@@IDENTITY
およびSCOPE_IDENTITY()
現在のセッションからの結果のみを返すため、NULLです。この新しいセッションではID列の挿入を実行していないため、NULLになります。
IDENT_CURRENT()
一方、結果はセッションやスコープに関係なく、指定されたテーブルに基づいているため、前の例と同じ結果を返します。