IDENTITY
列に明示的な値を挿入しようとする代わりに、SCOPE_IDENTITY
関数を使用して、現在のスコープとセッションに対して生成された最後の IDENTITY 値を取得する必要があります。
SET NOCOUNT ON;
CREATE TABLE dbo.Users(
UserID INT IDENTITY(1,1) PRIMARY KEY,
UserName NVARCHAR(200) NOT NULL
);
INSERT INTO dbo.Users (UserName)
VALUES ('John007');
SELECT SCOPE_IDENTITY() AS LastIdentityInserted#1;
INSERT INTO dbo.Users (UserName)
VALUES ('Mary008');
SELECT SCOPE_IDENTITY() AS LastIdentityInserted#2;
結果:
LastIdentityInserted#1
----------------------
1
LastIdentityInserted#2
----------------------
2
ただし、1行だけ挿入したい/必要な場合は、次のように OUTPUT 句を使用する必要があります。
DECLARE @inserted TABLE(UserID INT NOT NULL);
INSERT INTO dbo.Users (UserName)
OUTPUT inserted.UserID INTO @inserted(UserID)
SELECT ('George009')
UNION ALL
SELECT ('Jiji010');
-- Get the IDENTITY values for the last INSERT statement
SELECT * FROM @inserted;
結果 ( @inserted
):
UserID
-----------
3
4
答え:
例のように関数を使用することはできません。列@@IDENTITY
を持つテーブルがある場合、IDENTITY
この関数は次の方法でのみ使用できます。
INSERT INTO table(NonIdentityColumn) VALUES ('some value');
SELECT @@IDENTITY AS LastId_PerSession_And_ForAllScopes
また、@@IDENTITY
SELECT INTO ... を使用して、IDENTITY
列を持つヒープ テーブルを作成することもできます。
SELECT columns , @@IDENTITY AS ColumnName
INTO table
FROM ...
また、このブログ投稿を読んで、これら 3 つの関数の違いをよりよく理解することをお勧めします:
@@IDENTITY
、SCOPE_IDENTITY()
、IDENT_CURRENT
。