我使用下面的查询中插入多个记录的表:获取的最后插入记录的ID
INSERT INTO Table1(FirstName, LastName, EmailAddress)
SELECT t2.FirstName, t2.LastName, t2.EmailAddress
FROM Table2 t2
由于查询被插入多条记录,我不能用SCOPE_IDENTITY检索PK 。有什么方法可以获得最后插入的记录的ID吗?
我使用下面的查询中插入多个记录的表:获取的最后插入记录的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范围。 由于其他理查德指出,这仅适用,如果你的增量设置为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
现在,表中包含所有插入的IDS
'@@ rowcount'很有趣。但显然它假定增量为1.我假设它假设没有交织(例如不同会话)的插入是可能的:这可以得到保证吗? – Richard 2011-03-16 09:58:56
@Richard - 增量为1的好点。我从未使用任何其他增量。我本来以为插入是原子的和顺序的,但是有兴趣知道它是否是 – RichardTheKiwi 2011-03-16 10:00:58
只测试交错插入:一个会话打开事务并执行第一次插入。然后在会话二中做另一个插入。最后在第一次会话中做另一次插入和提交。来自第二个会话的插入获得id 2,并且第一个会话id 1和3.对于使用事务的并发会话,插入将交错。我不知道是否有一个多导轨插入可以看到这个,但它看起来是可能的(例如,插入是从另一个被锁定暂时阻止的表中读取)。 *总结:*在每次插入后,使用'OUTPUT'或执行一次插入一个'SCOPE_IDENTITY'。 – Richard 2011-03-17 14:48:20
为SCOPE_IDENTITY
该文档还列出@@IDENTITY
和IDENT_SCOPE
所有这些—有关范围不同的细节和会话—返回单标识符。
解决方案:添加一行并获取其身份,然后插入下一个&hellip ;.
不是重复,@nawfal - 这个问题是要求如何检索*多*插入行的ID。 – Shog9 2013-02-24 04:36:53
@ Shog9对,我会删除我的评论.. – nawfal 2013-02-24 15:41:18