SQL Serverでは、T-SQL SCOPE_IDENTITY()
を使用できます。 同じスコープのID列に挿入された最後のID値を返す関数。
スコープはモジュール(ストアドプロシージャ、トリガー、関数、またはバッチ)です。 2つのステートメントが同じストアドプロシージャ、関数、またはバッチにある場合、それらは同じスコープにあります。
現在のセッションの任意のテーブルで生成された最後のID値を返すことに注意してください 。これは、IDENT_CURRENT()
とは対照的です。 関数。指定されたテーブルに対して最後に挿入されたID値を返します。 、どのセッションにいるかに関係なく。
SCOPE_IDENTITY()
@@IDENTITY
と非常によく似ています どちらも、現在のセッションで最後に挿入されたID値を返します。違いは、SCOPE_IDENTITY()
@@IDENTITY
に対して、現在のスコープに制限されます 特定の範囲に限定されません。
例1-基本的な使用法
これがその仕組みの基本的なコード例です。
SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
結果:
+--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | NULL | +--------------------------------+
結果がNULLになる理由は、SQLServerへの新しい接続を開いた直後にステートメントを実行したためです。 SCOPE_IDENTITY()
関数は、現在のセッションからの結果のみを返します。
したがって、NULL以外の結果を取得するには、ID列に値を挿入する必要があります。
例2–NULL以外の結果の値を挿入する
この例では、ID列を持つテーブルを作成します。次に、テーブルの内容を選択してSCOPE_IDENTITY()
を実行する前に、そのテーブルにデフォルト値を挿入します。 もう一度。
CREATE TABLE scope_identity_test(id int IDENTITY(1,1)); INSERT scope_identity_test DEFAULT VALUES; SELECT id FROM scope_identity_test; SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
結果:
+------+ | id | |------| | 1 | +------+ (1 row affected) +--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 1 | +--------------------------------+ (1 row affected)
テーブルには1つの行があり、そのID列の値は1です。これは現在のセッションで最後に挿入されたID値であるため、SCOPE_IDENTITY()
1も返します。
ここで、別の行を追加すると、それに応じて値が増加します。
INSERT scope_identity_test DEFAULT VALUES; SELECT id FROM scope_identity_test; SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
結果:
+------+ | id | |------| | 1 | | 2 | +------+ (2 rows affected) +--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 2 | +--------------------------------+ (1 row affected)
新しいセッションの結果
前述のように、SCOPE_IDENTITY()
同じセッションからの結果のみを返します。これは@@IDENTITY
にも当てはまります 。
したがって、SQL Serverへの新しい接続を開き、前のSELECT
を実行すると もう一度言いますが、次の結果が得られます:
USE Test; SELECT id FROM scope_identity_test; SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
結果:
+------+ | id | |------| | 1 | | 2 | +------+ (2 rows affected) +--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | NULL | +--------------------------------+ (1 row affected)
次に、この新しいセッション内から新しい行を挿入しましょう:
INSERT scope_identity_test DEFAULT VALUES; SELECT id FROM scope_identity_test; SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
結果:
+------+ | id | |------| | 1 | | 2 | | 3 | +------+ (1 row affected) +--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 3 | +--------------------------------+ (3 rows affected)
そのため、新しいID値を挿入するとすぐに追いつきました。
ただし、元のセッションに戻ってSELECT
を実行してみましょう。 ステートメントを再度(新しい行を挿入せずに):
SELECT id FROM scope_identity_test; SELECT SCOPE_IDENTITY() AS [Last-Inserted Identity Value];
結果:
+------+ | id | |------| | 1 | | 2 | | 3 | +------+ (3 rows affected) +--------------------------------+ | Last-Inserted Identity Value | |--------------------------------| | 2 | +--------------------------------+ (1 row affected)
したがって、元のセッションのSCOPE_IDENTITY()
結果は2回目のセッションの影響を受けていません。
2番目のスコープの追加
SCOPE_IDENTITY()
を差別化するもの @@IDENTITY
から 、それはSCOPE_IDENTITY()
現在のスコープに制限されます。
たとえば、テーブルにID値を別のテーブルに挿入するトリガーがある場合、SCOPE_IDENTITY()
最初のID値のみを報告します。 2番目のテーブルのID値は、別のスコープ@@IDENTITY
で作成されたため、無視されます。 一方、2番目のテーブルのID値を報告します(すべてのスコープをカバーしているため)。
私が言っていることの例については、SQLServerのIDENT_CURRENTと@@IDENTITYとSCOPE_IDENTITYの違いを参照してください:違いは何ですか?
その記事では、私がここで話しているようなトリガーの例について説明します。