@@IDENTITY、SCOPE_IDENTITY()、OUTPUT句、IDENTITY_INSERTの違い
SQL ServerでINSERTした値のIDを取得する方法
SQL ServerでINSERT
ステートメントを実行した後、挿入されたレコードのIDを取得することはよくある操作です。このIDは、そのレコードを後で参照したり、更新したり、削除したりするために使用できます。
方法
IDを取得するには、いくつかの方法があります。
@@IDENTITY
は、最後に挿入されたIDを取得するための特殊な変数です。INSERT
ステートメントの後に単独で実行できます。
INSERT INTO テーブル名 (列名, 列名) VALUES (値, 値);
SELECT @@IDENTITY;
SCOPE_IDENTITY()
は、現在のスコープ内で最後に挿入されたIDを取得するための関数です。INSERT
ステートメントと同じステートメント内で実行する必要があります。
INSERT INTO テーブル名 (列名, 列名) VALUES (値, 値);
DECLARE @id INT;
SET @id = SCOPE_IDENTITY();
OUTPUT
句を使用して、INSERT
ステートメントの結果セットにIDを含めることができます。
INSERT INTO テーブル名 (列名, 列名) VALUES (値, 値)
OUTPUT INSERTED.id;
IDENTITY_INSERT
オプションを使用して、INSERT
ステートメントでIDを明示的に指定することができます。
SET IDENTITY_INSERT テーブル名 ON;
INSERT INTO テーブル名 (id, 列名, 列名) VALUES (1, 値, 値);
SET IDENTITY_INSERT テーブル名 OFF;
- @@IDENTITYは、最もシンプルで簡単な方法です。
- **SCOPE_IDENTITY()
**は、複数の
INSERT`ステートメントを実行する場合に便利です。 - OUTPUT句は、IDを他の列と一緒に取得する場合に便利です。
- IDENTITY_INSERTは、IDを明示的に指定したい場合に便利です。
注意
@@IDENTITY
とSCOPE_IDENTITY()
は、最後に挿入されたIDのみを取得します。複数行を挿入した場合、これらの変数は最初の行のIDのみを返します。IDENTITY_INSERT
オプションを使用する場合は、挿入後に必ずオフにすることを忘れないでください。
-- テーブルの作成
CREATE TABLE テーブル名 (
id INT IDENTITY(1, 1) PRIMARY KEY,
列名 VARCHAR(50),
列名 INT
);
-- レコードの挿入
INSERT INTO テーブル名 (列名, 列名) VALUES ('値', 10);
-- @@IDENTITY を使用して ID を取得
SELECT @@IDENTITY;
-- SCOPE_IDENTITY() を使用して ID を取得
DECLARE @id INT;
SET @id = SCOPE_IDENTITY();
-- OUTPUT 句を使用して ID を取得
INSERT INTO テーブル名 (列名, 列名) VALUES ('値', 10)
OUTPUT INSERTED.id;
-- IDENTITY_INSERT を使用して ID を取得
SET IDENTITY_INSERT テーブル名 ON;
INSERT INTO テーブル名 (id, 列名, 列名) VALUES (1, '値', 10);
SET IDENTITY_INSERT テーブル名 OFF;
このコードを実行すると、以下の結果が出力されます。
1
1
1
1
上記は基本的な例です。実際のコードは、要件に合わせて変更する必要があります。
ユーザー定義関数を使用して、IDを取得することができます。
これらの方法は、より複雑な要件を満たす場合に役立ちます。
注意事項
- 上記の方法を使用する場合は、パフォーマンスとセキュリティに注意する必要があります。
- 複雑な要件がある場合は、データベース管理者に相談することをお勧めします。
sql-server