SQL Server - INSERT後に値を取得する - ストアドプロシージャ
SQL ServerでINSERT
を実行した後、挿入されたレコードの値を取得したい場合があります。この場合、いくつかの方法があります。
方法
@@IDENTITY
IDENTITY
プロパティを持つ列に値を挿入する場合、@@IDENTITY
変数を使用して、挿入されたレコードのIDを取得できます。
INSERT INTO dbo.MyTable (Name) VALUES ('Test');
SELECT @@IDENTITY;
OUTPUT
句を使用して、挿入されたレコードの値を直接取得できます。
INSERT INTO dbo.MyTable (Name) OUTPUT INSERTED.ID VALUES ('Test');
DECLARE @ID INT;
SET @ID = (SELECT ID FROM INSERTED);
SELECT @ID;
DECLARE @ID INT;
INSERT INTO dbo.MyTable (Name) VALUES ('Test') RETURNING INTO @ID;
SELECT @ID;
INSERT INTO dbo.MyTable (Name) VALUES ('Test');
SELECT ID, Name FROM dbo.MyTable WHERE Name = 'Test';
方法の比較
方法 | 利点 | 欠点 |
---|---|---|
@@IDENTITY | シンプル | IDENTITYプロパティを持つ列にしか使用できない |
OUTPUT句 | 柔軟性が高い | 古いバージョンのSQL Serverでは使用できない |
RETURNING INTO | 変数に直接格納できる | 古いバージョンのSQL Serverでは使用できない |
SELECT | 汎用性が高い | 他の方法より複雑 |
注意事項
- 複数の行を挿入する場合、
@@IDENTITY
、OUTPUT
句、RETURNING INTO
は最初の行の値のみ取得します。 - トランザクション内で
INSERT
を実行している場合、@@IDENTITY
、OUTPUT
句、RETURNING INTO
はコミットされるまで値を取得できません。
上記以外にも、トリガーやストアドプロシージャを使用して、INSERT
後に値を取得する方法があります。
-- @@IDENTITY
CREATE TABLE dbo.MyTable (
ID INT IDENTITY(1, 1),
Name VARCHAR(50)
);
INSERT INTO dbo.MyTable (Name) VALUES ('Test');
SELECT @@IDENTITY;
-- OUTPUT句
CREATE TABLE dbo.MyTable (
ID INT IDENTITY(1, 1),
Name VARCHAR(50)
);
INSERT INTO dbo.MyTable (Name) OUTPUT INSERTED.ID VALUES ('Test');
DECLARE @ID INT;
SET @ID = (SELECT ID FROM INSERTED);
SELECT @ID;
-- RETURNING INTO
CREATE TABLE dbo.MyTable (
ID INT IDENTITY(1, 1),
Name VARCHAR(50)
);
DECLARE @ID INT;
INSERT INTO dbo.MyTable (Name) VALUES ('Test') RETURNING INTO @ID;
SELECT @ID;
-- SELECT
CREATE TABLE dbo.MyTable (
ID INT IDENTITY(1, 1),
Name VARCHAR(50)
);
INSERT INTO dbo.MyTable (Name) VALUES ('Test');
SELECT ID, Name FROM dbo.MyTable WHERE Name = 'Test';
上記のサンプルコードは、@@IDENTITY
、OUTPUT
句、RETURNING INTO
、SELECT
を使用して、INSERT
後に値を取得する方法を示しています。
実行方法
- SQL Server Management Studio (SSMS) を起動します。
- 新しいクエリウィンドウを開きます。
- サンプルコードをクエリウィンドウに貼り付けます。
F5
キーを押してクエリを実行します。
結果
@@IDENTITY
、OUTPUT
句、RETURNING INTO
、SELECT
はいずれも、挿入されたレコードのIDを取得します。
トリガー
CREATE TRIGGER dbo.MyTable_Insert ON dbo.MyTable
AFTER INSERT
AS
BEGIN
SELECT ID, Name FROM INSERTED;
END;
ストアドプロシージャを使用して、INSERT
を実行し、挿入されたレコードの値を取得できます。
CREATE PROCEDURE dbo.MyTable_Insert
@Name VARCHAR(50)
AS
BEGIN
INSERT INTO dbo.MyTable (Name) VALUES (@Name);
SELECT ID, Name FROM dbo.MyTable WHERE Name = @Name;
END;
これらの方法は、より複雑な処理が必要な場合に有効です。
- トリガーやストアドプロシージャを使用する場合は、パフォーマンスに注意する必要があります。
- トランザクション内で
INSERT
を実行している場合、トリガーやストアドプロシージャはコミットされるまで値を取得できません。
sql sql-server sql-server-2008