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

SQLServerのIDENT_CURRENTと@@IDENTITYとSCOPE_IDENTITYの違い:違いは何ですか?

    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() 一方、結果はセッションやスコープに関係なく、指定されたテーブルに基づいているため、前の例と同じ結果を返します。


    1. C#アプリケーションでSQL Serverデータベースのすべてのテーブルの名前を取得できますか?

    2. SQLServerの論理OR演算子とは-SQLServer/TSQLチュートリアルパート119

    3. MySQLのJSON_MERGE_PATCH()とJSON_MERGE_PRESERVE():違いは何ですか?

    4. SEC_TO_TIME()の例– MySQL