SCOPE_IDENTITY() を使用して挿入された行の ID を取得する方法
SQL Server で挿入された行の ID を取得する方法
SQL Server で INSERT ステートメントを使用して行を挿入した後、その行の ID を取得する必要がある場合があります。この ID は、多くの場合、主キーとして使用されます。
方法
挿入された行の ID を取得するには、次の 3 つの方法があります。
@@IDENTITY は、最後に挿入された行の ID を含む特殊な変数です。この変数は、INSERT ステートメントの後に使用できます。
INSERT INTO テーブル名 (列名) VALUES (値);
SELECT @@IDENTITY;
INSERT INTO テーブル名 (列名) VALUES (値);
SELECT SCOPE_IDENTITY();
OUTPUT 句は、INSERT ステートメントによって挿入された行のデータを取得するために使用できます。この句を使用すると、ID を含むすべての列を取得できます。
INSERT INTO テーブル名 (列名) VALUES (値)
OUTPUT INSERTED.列名;
例
次の例では、Customers
テーブルに新しい顧客を挿入し、その ID を取得する方法を示します。
INSERT INTO Customers (FirstName, LastName) VALUES ('John', 'Doe');
-- @@IDENTITY を使用する
SELECT @@IDENTITY;
-- SCOPE_IDENTITY() を使用する
SELECT SCOPE_IDENTITY();
-- OUTPUT 句を使用する
INSERT INTO Customers (FirstName, LastName) VALUES ('Jane', 'Doe')
OUTPUT INSERTED.CustomerID;
注意事項
- @@IDENTITY と SCOPE_IDENTITY() は、現在の接続スコープ内で最後に挿入された行の ID を返します。別の接続スコープで挿入された行の ID を取得するには、OUTPUT 句を使用する必要があります。
- @@IDENTITY と SCOPE_IDENTITY() は、IDENTITY 列を持つテーブルにのみ使用できます。
-- テーブル作成
CREATE TABLE Customers (
CustomerID int IDENTITY(1, 1) PRIMARY KEY,
FirstName varchar(50) NOT NULL,
LastName varchar(50) NOT NULL
);
-- @@IDENTITY を使用する
INSERT INTO Customers (FirstName, LastName) VALUES ('John', 'Doe');
SELECT @@IDENTITY;
-- SCOPE_IDENTITY() を使用する
INSERT INTO Customers (FirstName, LastName) VALUES ('Jane', 'Doe');
SELECT SCOPE_IDENTITY();
-- OUTPUT 句を使用する
INSERT INTO Customers (FirstName, LastName) VALUES ('Peter', 'Smith')
OUTPUT INSERTED.CustomerID;
このコードを実行すると、次の結果が表示されます。
1
2
3
- @@IDENTITY、SCOPE_IDENTITY()、および OUTPUT 句の詳細については、Microsoft Docs を参照してください。
- 上記のサンプルコードは、SQL Server 2019 でテストされています。
他の方法
トリガーを使用する
トリガーは、データ操作言語 (DML) ステートメントが実行されたときに実行される特殊なストアドプロシージャです。挿入された行の ID を取得するには、INSERT トリガーを作成できます。
IDENTITY 関数は、シーケンスの次の値を返します。この関数は、INSERT ステートメントの前に使用して、挿入される行の ID を事前に取得できます。
CREATE TRIGGER trg_Customers_Insert
ON Customers
AFTER INSERT
AS
BEGIN
SELECT @@IDENTITY;
END;
INSERT INTO Customers (FirstName, LastName) VALUES ('John', 'Doe');
このコードを実行すると、トリガーが実行され、挿入された行の ID が出力されます。
- トリガーは、複雑なコードになる可能性があります。
- INSERTED 仮想テーブルは、SQL Server 2008 以降でのみ使用できます。
sql sql-server t-sql