sql >> データベース >  >> RDS >> Sqlserver

SCOPE_IDENTITY()を使用して、同じスコープで最後に挿入されたID値を返します(SQL Server)

    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の違いを参照してください:違いは何ですか?

    その記事では、私がここで話しているようなトリガーの例について説明します。


    1. SQL ServerでのDATEPART()の例

    2. JSON_INSERT()–MySQLのJSONドキュメントに値を挿入します

    3. Oracleデータベースでの元に戻すとやり直しとは

    4. SQLServerで英数字以外の文字を含む行を返す