2011-03-16 95 views
6

我使用下面的查询中插入多个记录的表:获取的最后插入记录的ID

INSERT INTO Table1(FirstName, LastName, EmailAddress) 
    SELECT t2.FirstName, t2.LastName, t2.EmailAddress 
    FROM Table2 t2 

由于查询被插入多条记录,我不能用SCOPE_IDENTITY检索PK 。有什么方法可以获得最后插入的记录的ID吗?

+0

不是重复,@nawfal - 这个问题是要求如何检索*多*插入行的ID。 – Shog9 2013-02-24 04:36:53

+0

@ Shog9对,我会删除我的评论.. – nawfal 2013-02-24 15:41:18

回答

12

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

+2

'@@ rowcount'很有趣。但显然它假定增量为1.我假设它假设没有交织(例如不同会话)的插入是可能的:这可以得到保证吗? – Richard 2011-03-16 09:58:56

+0

@Richard - 增量为1的好点。我从未使用任何其他增量。我本来以为插入是原子的和顺序的,但是有兴趣知道它是否是 – RichardTheKiwi 2011-03-16 10:00:58

+1

只测试交错插入:一个会话打开事务并执行第一次插入。然后在会话二中做另一个插入。最后在第一次会话中做另一次插入和提交。来自第二个会话的插入获得id 2,并且第一个会话id 1和3.对于使用事务的并发会话,插入将交错。我不知道是否有一个多导轨插入可以看到这个,但它看起来是可能的(例如,插入是从另一个被锁定暂时阻止的表中读取)。 *总结:*在每次插入后,使用'OUTPUT'或执行一次插入一个'SCOPE_IDENTITY'。 – Richard 2011-03-17 14:48:20

0

SCOPE_IDENTITY该文档还列出@@IDENTITYIDENT_SCOPE所有这些—有关范围不同的细节和会话—返回标识符。

解决方案:添加一行并获取其身份,然后插入下一个&hellip ;.