SQL Serverでは、T-SQL @@IDENTITY
を使用できます。 現在のセッションで最後に挿入されたID値を返すシステム関数。
anyで生成された最後のID値を返すことに注意してください テーブル現在のセッション 。これは、IDENT_CURRENT()
とは対照的です。 関数。指定されたテーブルに対して最後に挿入されたID値を返します。 。
SCOPE_IDENTITY()
関数は@@IDENTITY
と非常によく似ています また、現在のセッションで最後に挿入されたID値も返します。違いは、SCOPE_IDENTITY()
現在のスコープに限定されます。
例1
@@IDENTITY
の基本的なコード例を次に示します。 使用法。
SELECT @@IDENTITY AS [Last-Inserted Identity Value];
結果:
+--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | NULL | +--------------------------------+
これがNULL
を返す理由 これは、SQL Serverに対して新しいセッションを開いたが、現在のセッション中にID列をまだ更新していないためです。
以下は、ID列の更新を行うコードです。
CREATE TABLE Cats(id int IDENTITY); CREATE TABLE Dogs(id int IDENTITY); INSERT Cats DEFAULT VALUES; INSERT Cats DEFAULT VALUES; SELECT @@IDENTITY AS [Last-Inserted Identity Value];
結果:
+--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 2 | +--------------------------------+
ここでは、いくつかのテーブルを作成し、データを挿入してから、現在のID値を選択します。
そのテーブルに2つの行を挿入したため、現在のID値は2です。
次に、一方の行をもう一方のテーブルに挿入しましょう:
INSERT Dogs DEFAULT VALUES; SELECT @@IDENTITY AS [Last-Inserted Identity Value];
結果:
+--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 1 | +--------------------------------+
このセッションで最後に挿入されたID値であるため、戻り値は1です。
例2– IDENT_CURRENT()との比較
ここでは、IDENT_CURRENT()
と比較されます 。
SELECT @@IDENTITY AS [@@IDENTITY], IDENT_CURRENT('Cats') AS [IDENT_CURRENT('Cats')], IDENT_CURRENT('Dogs') AS [IDENT_CURRENT('Dogs')];
結果:
+--------------+-------------------------+-------------------------+ | @@IDENTITY | IDENT_CURRENT('Cats') | IDENT_CURRENT('Dogs') | |--------------+-------------------------+-------------------------| | 1 | 2 | 1 | +--------------+-------------------------+-------------------------+
前述のように、IDENT_CURRENT()
指定されたテーブルに基づいて結果を返します。したがって、これを使用して、各テーブルの最後のID値を見つけることができます。
例3–新しいセッションに切り替える
ここで、新しい接続を開いて@@IDENTITY
を選択すると 繰り返しますが、これが起こります:
USE Test; SELECT @@IDENTITY AS [@@IDENTITY], IDENT_CURRENT('Cats') AS [IDENT_CURRENT('Cats')], IDENT_CURRENT('Dogs') AS [IDENT_CURRENT('Dogs')];
結果:
+--------------+-------------------------+-------------------------+ | @@IDENTITY | IDENT_CURRENT('Cats') | IDENT_CURRENT('Dogs') | |--------------+-------------------------+-------------------------| | NULL | 2 | 1 | +--------------+-------------------------+-------------------------+
@@IDENTITY
新しいセッションのID列に何も挿入していないため、結果はNULLになります。
IDENT_CURRENT()
結果はセッションではなくテーブルに基づいているため、結果はNULLではありません。
@@ IDENTITY vs SCOPE_IDENTITY()vs IDENT_CURRENT()
SQLServerのIDENT_CURRENTと@@IDENTITYとSCOPE_IDENTITYの違いを参照してください:違いは何ですか?これら3つの機能の違いを説明する簡単な例をご覧ください。