2011-03-16 109 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 ;.