我正在使用以下查询向表中插入多条记录:
INSERT INTO Table1(FirstName, LastName, EmailAddress)
SELECT t2.FirstName, t2.LastName, t2.EmailAddress
FROM Table2 t2
由于查询正在插入多个记录,因此我无法使用SCOPE_IDENTITY来检索PK。是否有任何方法可以获取最后插入记录的ID?
我正在使用以下查询向表中插入多条记录:
INSERT INTO Table1(FirstName, LastName, EmailAddress)
SELECT t2.FirstName, t2.LastName, t2.EmailAddress
FROM Table2 t2
由于查询正在插入多个记录,因此我无法使用SCOPE_IDENTITY来检索PK。是否有任何方法可以获取最后插入记录的ID?
SCOPE_IDENTITY()能正确返回最后一个ID。你需要将其与@@ROWCOUNT结合使用,以获得ID范围。正如其他Richard指出的那样,这仅在增量设置为1时才有效。
例如:
declare @last int, @first int
insert ...
select @last = scope_identity(), @first = scope_identity() - @@rowcount + 1
另一种方法(在SQL Server 2008中使用可保证结果)是使用OUTPUT子句来执行此操作。
declare @ids table (id int)
INSERT INTO Table1 (FirstName ,LastName ,EmailAddress)
output inserted.id into @ids
-- Get the ids
SELECT id from @Ids
@@rowcount
很有趣。但显然它假设增量为1。我假设它假设插入没有交错(例如,不同的会话):这可以得到保证吗? - RichardOUTPUT
或每次插入后使用SCOPE_IDENTITY
逐个执行插入。 - RichardSCOPE_IDENTITY
的文档还列出了 @@IDENTITY
和 IDENT_SCOPE
,它们都返回一个单一的标识符,但有关范围和会话的细节不同。
解决方案:添加一行并获取其标识,然后插入下一行......