最後のIDENTITY値を取得! @@IDENTITY、SCOPE_IDENTITY()、IDENT_CURRENT() の使い分け
SQL Server の SCOPE_IDENTITY(), IDENTITY(), @@IDENTITY, IDENT_CURRENT() の違い
@@IDENTITY
@@IDENTITY
は、現在のセッションで最後に挿入された IDENTITY 値を取得します。これは、どのスコープで挿入された値でも取得できます。
例:
USE TestDB;
GO
CREATE TABLE MyTable (
ID INT IDENTITY(1,1),
Name VARCHAR(50)
);
GO
INSERT INTO MyTable (Name) VALUES ('Test1');
SELECT @@IDENTITY;
-- 結果: 1
INSERT INTO MyTable (Name) VALUES ('Test2');
SELECT @@IDENTITY;
-- 結果: 2
SCOPE_IDENTITY()
USE TestDB;
GO
CREATE TABLE MyTable (
ID INT IDENTITY(1,1),
Name VARCHAR(50)
);
GO
CREATE TRIGGER MyTrigger ON MyTable
AFTER INSERT
AS
BEGIN
INSERT INTO MyTable (Name) VALUES ('TriggerInserted');
END;
GO
INSERT INTO MyTable (Name) VALUES ('Test1');
SELECT SCOPE_IDENTITY();
-- 結果: 1
INSERT INTO MyTable (Name) VALUES ('Test2');
SELECT SCOPE_IDENTITY();
-- 結果: 2
-- トリガーによって挿入されたレコードの ID
SELECT ID FROM MyTable WHERE Name = 'TriggerInserted';
-- 結果: 3
IDENT_CURRENT()
USE TestDB;
GO
CREATE TABLE MyTable (
ID INT IDENTITY(1,1),
Name VARCHAR(50)
);
GO
CREATE TRIGGER MyTrigger ON MyTable
AFTER INSERT
AS
BEGIN
INSERT INTO MyTable (Name) VALUES ('TriggerInserted');
END;
GO
INSERT INTO MyTable (Name) VALUES ('Test1');
SELECT IDENT_CURRENT();
-- 結果: 1
INSERT INTO MyTable (Name) VALUES ('Test2');
SELECT IDENT_CURRENT();
-- 結果: 2
-- トリガーによって挿入されたレコードの ID
SELECT ID FROM MyTable WHERE Name = 'TriggerInserted';
-- 結果: 3
IDENTITY()
は、SELECT INTO ステートメントで使用され、新しい行に挿入される IDENTITY 値を指定します。
USE TestDB;
GO
CREATE TABLE MyTable (
ID INT IDENTITY(1,1),
Name VARCHAR(50)
);
GO
DECLARE @NewID INT;
SELECT @NewID = IDENTITY(MyTable, ID);
INSERT INTO MyTable (Name) VALUES ('Test1');
SELECT ID FROM MyTable WHERE ID = @NewID;
-- 結果: 1
@@IDENTITY
: 現在のセッションで最後に挿入された IDENTITY 値を取得
これらの違いを理解することで、目的の IDENTITY 値を正しく取得することができます。
USE TestDB;
GO
CREATE TABLE MyTable (
ID INT IDENTITY(1,1),
Name VARCHAR(50)
);
GO
-- @@IDENTITY
INSERT INTO MyTable (Name) VALUES ('Test1');
SELECT @@IDENTITY;
-- 結果: 1
-- SCOPE_IDENTITY()
BEGIN TRAN
INSERT INTO MyTable (Name) VALUES ('Test2');
SELECT SCOPE_IDENTITY();
ROLLBACK TRAN;
-- 結果: 2
-- IDENT_CURRENT()
INSERT INTO MyTable (Name) VALUES ('Test3');
SELECT IDENT_CURRENT();
-- 結果: 3
-- IDENTITY()
DECLARE @NewID INT;
SELECT @NewID = IDENTITY(MyTable, ID);
INSERT INTO MyTable (Name) VALUES ('Test4');
SELECT ID FROM MyTable WHERE ID = @NewID;
-- 結果: 4
このコードを実行することで、@@IDENTITY
, SCOPE_IDENTITY()
, IDENT_CURRENT()
, IDENTITY()
のそれぞれの動作を確認することができます。
OUTPUT
句を使用して、挿入された行の列値を取得することができます。
USE TestDB;
GO
CREATE TABLE MyTable (
ID INT IDENTITY(1,1),
Name VARCHAR(50)
);
GO
INSERT INTO MyTable (Name) VALUES ('Test1')
OUTPUT INSERTED.ID;
-- 結果: 1
USE TestDB;
GO
CREATE TABLE MyTable (
ID INT IDENTITY(1,1),
Name VARCHAR(50)
);
GO
INSERT INTO MyTable (Name) VALUES ('Test1');
SELECT ID FROM INSERTED;
-- 結果: 1
USE TestDB;
GO
CREATE TABLE MyTable (
ID INT IDENTITY(1,1),
Name VARCHAR(50)
);
GO
CREATE TRIGGER MyTrigger ON MyTable
AFTER INSERT
AS
BEGIN
DECLARE @ID INT;
SELECT @ID = ID FROM INSERTED;
-- ここに @ID を使用して処理を行う
END;
GO
INSERT INTO MyTable (Name) VALUES ('Test1');
-- ここに処理が実行される
sql sql-server identity