SQL Server で @@IDENTITY, SCOPE_IDENTITY(), OUTPUT およびその他の方法を使用して最後の ID を取得する方法

2024-04-02

SQL Server で @@IDENTITY, SCOPE_IDENTITY(), OUTPUT およびその他の方法を使用して最後の ID を取得する方法

SQL Server で INSERT ステートメントを実行した後、IDENTITY 列の最後の値を取得する必要がある場合があります。 これは、新しい行の関連 ID を取得したり、後続の INSERT ステートメントで使用するために最後の ID を保存したりするために行うことができます。

最後の ID を取得するには、いくつかの方法があります。

  • @@IDENTITY
  • SCOPE_IDENTITY()
  • OUTPUT 句
  • INSERTED テーブル
  • トリガー

方法の詳細

@@IDENTITY は、最後に挿入された行の IDENTITY 列の値を返すグローバル変数です。 @@IDENTITY は、次のいずれかの条件を満たす場合にのみ使用できます。

  • IDENTITY 列を含むテーブルに INSERT ステートメントを実行した最後のステートメントであること。
  • INSERT ステートメントがトリガーによって実行されたものではないこと。

次の例は、@@IDENTITY を使用して最後の ID を取得する方法を示します。

INSERT INTO MyTable (Name) VALUES ('John Doe');

SELECT @@IDENTITY;

SCOPE_IDENTITY() は、現在のスコープ内で最後に挿入された行の IDENTITY 列の値を返す関数です。 @@IDENTITY と異なり、SCOPE_IDENTITY() は、トリガーによって実行された INSERT ステートメントの後でも使用できます。

BEGIN TRAN;

INSERT INTO MyTable (Name) VALUES ('John Doe');

DECLARE @ID INT;

SET @ID = SCOPE_IDENTITY();

COMMIT TRAN;

SELECT @ID;

OUTPUT 句を使用して、INSERT ステートメントの影響を受けた行の列値を取得できます。

DECLARE @ID INT;

INSERT INTO MyTable (Name) VALUES ('John Doe')
OUTPUT INSERTED.ID INTO @ID;

SELECT @ID;

INSERTED テーブルは、INSERT ステートメントの影響を受けた行の仮想テーブルです。 INSERTED テーブルを使用して、挿入された行のすべての列値にアクセスできます。

INSERT INTO MyTable (Name) VALUES ('John Doe');

SELECT ID
FROM INSERTED;

トリガーを使用して、INSERT ステートメントが実行された後に最後の ID を取得できます。

CREATE TRIGGER MyTrigger
ON MyTable
AFTER INSERT
AS
BEGIN
    DECLARE @ID INT;

    SELECT @ID = @@IDENTITY;

    -- 最後の ID を使用して何かを行う
END;

どの方法を使用するかは、要件によって異なります。 @@IDENTITY は、最もシンプルで効率的な方法ですが、いくつかの制限があります。 SCOPE_IDENTITY() は、トリガーによって実行された INSERT ステートメントの後でも使用できるため、より汎用的な方法です。 OUTPUT 句は、挿入された行の他の列値にもアクセスする必要がある場合に便利です。 INSERTED テーブルは、より複雑なシナリオで最後の ID を取得する必要がある場合に使用できます。 トリガーは、最後の ID を使用して他の操作を実行する必要がある場合に使用できます。




@@IDENTITY を使用して最後の ID を取得する

INSERT INTO MyTable (Name) VALUES ('John Doe');

SELECT @@IDENTITY;

SCOPE_IDENTITY() を使用して最後の ID を取得する

BEGIN TRAN;

INSERT INTO MyTable (Name) VALUES ('John Doe');

DECLARE @ID INT;

SET @ID = SCOPE_IDENTITY();

COMMIT TRAN;

SELECT @ID;

OUTPUT 句を使用して最後の ID を取得する

DECLARE @ID INT;

INSERT INTO MyTable (Name) VALUES ('John Doe')
OUTPUT INSERTED.ID INTO @ID;

SELECT @ID;

INSERTED テーブルを使用して最後の ID を取得する

INSERT INTO MyTable (Name) VALUES ('John Doe');

SELECT ID
FROM INSERTED;

トリガーを使用して最後の ID を取得する

CREATE TRIGGER MyTrigger
ON MyTable
AFTER INSERT
AS
BEGIN
    DECLARE @ID INT;

    SELECT @ID = @@IDENTITY;

    -- 最後の ID を使用して何かを行う
END;



他の方法

  • IDENTITY_INSERT オプション

IDENTITY_INSERT オプションを使用すると、INSERT ステートメントで IDENTITY 列の値を明示的に指定できます。

SET IDENTITY_INSERT MyTable ON;

INSERT INTO MyTable (ID, Name) VALUES (10, 'John Doe');

SET IDENTITY_INSERT MyTable OFF;

SELECT @@IDENTITY;
  • SEQUENCE オブジェクト

SEQUENCE オブジェクトを使用して、ID 値を生成できます。

CREATE SEQUENCE MySequence;

INSERT INTO MyTable (Name) VALUES ('John Doe');

SELECT NEXT VALUE FOR MySequence;
  • CLR ルーチン

CLR ルーチンを使用して、ID 値を生成できます。

どの方法を使用するかは、要件によって異なります。 上記で説明した方法に加えて、他の方法も検討する必要があります。


sql sql-server t-sql


SQLでWHERE句とGROUP BY句を使ってデータをフィルタリングする方法

以下の環境を用意する必要があります。データベース (MySQL、PostgreSQL、SQLiteなど)SQL クエリを実行できるツール (MySQL Workbench、pgAdmin、DB Browser for SQLiteなど)このチュートリアルでは、以下のサンプルデータを使用します。...


【MySQL/SQL/SQL Server】LEFT OUTER JOINでNULLをデフォルト値に置き換える方法を徹底解説!

この場合、結果セットのNULL値をデフォルト値やその他の値に置き換えることが必要になる場合があります。以下、MySQL、SQL Server、共通の代替方法について説明します。MySQLでは、COALESCE() 関数を使用して、LEFT OUTER JOINで返されるNULL値をデフォルト値に置き換えることができます。...


DbContext.Database.SqlQuery メソッドの活用:ストアド プロシージャとの連携

このチュートリアルでは、Entity Framework (EF) Code First CTP5 で DbContext. Database. SqlQuery<TElement>(sql, params) メソッドを使用してストアド プロシージャを呼び出す方法を説明します。...


SQL、SQLite、Cocoaで「LIKE 'searchstr%'」を使うべき?インデックスの落とし穴と解決策を徹底解説

この文書では、SQL、SQLite、Cocoa における LIKE 'searchstr%' 演算子とインデックスの使用について、プログラミング初心者にも分かりやすく解説します。LIKE 'searchstr%' 演算子は、データベース内の文字列列が特定のパターンに一致するかどうかを検査するために使用されます。このパターンは、プレフィックス(接頭辞)、サフィックス(接尾辞)、または完全一致を含む任意の文字列にすることができます。...


PostgreSQL: 安全かつ簡単にユーザーをスーパーユーザーにアップグレードする方法

PostgreSQLでは、スーパーユーザーと呼ばれる特別なユーザーアカウントが存在します。スーパーユーザーは、データベースのすべてのオブジェクトを作成、変更、削除する権限を持ち、他のユーザーに権限を付与することもできます。このチュートリアルでは、既存のユーザーをスーパーユーザーにアップグレードする方法を2つの方法で説明します。...


SQL SQL SQL SQL Amazon で見る



最後のIDENTITY値を取得! @@IDENTITY、SCOPE_IDENTITY()、IDENT_CURRENT() の使い分け

@@IDENTITY@@IDENTITY は、現在のセッションで最後に挿入された IDENTITY 値を取得します。これは、どのスコープで挿入された値でも取得できます。例:SCOPE_IDENTITY()IDENT_CURRENT()IDENTITY() は、SELECT INTO ステートメントで使用され、新しい行に挿入される IDENTITY 値を指定します。