我使用下面的查詢中插入多個記錄的表:獲取的最後插入記錄的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