而不是尝试将显式值插入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
但是,如果您想要/需要仅插入一行,那么您应该使用 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 ...
另外,我的建议是阅读这篇博文,以更好地了解这三个函数之间的区别:
@@IDENTITY
、SCOPE_IDENTITY()
、IDENT_CURRENT
。