SQL Server で @@IDENTITY, SCOPE_IDENTITY(), OUTPUT およびその他の方法を使用して最後の ID を取得する方法
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