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

@@ IDENTITYを使用して、SQLServerで最後に挿入されたID値を返します

    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つの機能の違いを説明する簡単な例をご覧ください。


    1. MySQLとMariaDBとPerconaサーバー:セキュリティ機能の比較

    2. 記憶圧分析のリスク状態

    3. SQL ServerでFILEPROPERTY()を使用する方法

    4. 「警告:sl_tableとpg_classの間に不一致が見つかりました。」 Slony-Iで