2008-09-18 69 views
45

我從另一個表B插入多個記錄到表A中。有沒有辦法獲得表A的記錄的標識值並更新表b的記錄而不用做光標?如何插入多個記錄並獲取標識值?

Create Table A 
(id int identity, 
Fname nvarchar(50), 
Lname nvarchar(50)) 

Create Table B 
(Fname nvarchar(50), 
Lname nvarchar(50), 
NewId int) 

Insert into A(fname, lname) 
SELECT fname, lname 
FROM B 

我使用MS SQL Server 2005的

+0

我意識到這是一個老問題,它指定了SQL Server 2005,但是它是第一個顯示2008年可用的MERGE語句的結果,以後應該提及那些尋求解決方案的人。 併入 TargetTable USING ( SELECT .... )AS源開 1 = 2 WHEN NOT然後再配 INSERT .... OUTPUT inserted.ID INTO 不是Temptable ( InsertedID ) – oldegreyg 2017-04-12 17:54:09

+0

你不需要一個簡單的插入合併。合併對於插入/更新是很好的,但對於簡單的插入來說是過度的。安迪的輸出答案爲我工作,並幫助拿走索引鎖。 – CodeMonkeyForHire 2017-04-13 14:23:46

+0

安迪歐文的答案是最好的。觸發器很笨拙,不適用於目標表上的任意操作,尤其是在目標是臨時目錄或中間目標時。 Darren的回答是錯誤的,如果你插入一組行,它們在目標表中的順序不一定與你的順序相同。德米特里的方式是不好的,因爲它需要一個循環周圍插入一行,這是一個慢性能明智的,總是使用集時,你可以。科裏的方式很糟糕,他解釋了爲什麼,「只要他們不衝突。」這將打開到星期六晚上c – clemahieu 2008-12-13 08:02:45

回答

-6

MBelly是正確的金錢 - 但隨後觸發會一直嘗試並更新表B中即使不是必需的(因爲你還從表C中插入?)。

Darren在這裏也是正確的,你不能得到多個身份作爲結果集。你的選擇是使用遊標併爲你插入的每一行記錄身份,或者使用Darren的方法在前後存儲身份。只要你知道這個應該起作用的身份的增量,只要你確保所有三個事件的表都被鎖定了。

如果是我,而且沒有時間限制,我會用光標去。

0

如果你總是希望這樣的行爲,你可以TableA上,將更新表B.

0

把一個AFTER INSERT觸發器可以得到加入row number。這是可能的,因爲它是一個身份,它會隨着添加項目而增加,這將按照您選擇的順序進行。

+2

錯誤,記錄不保證按照您認爲他們要進入的順序進入數據庫。 – HLGEM 2009-01-28 22:34:36

0

據我瞭解您遇到的問題是,你要插入到表A,其中有標識列,並且要保留從表B中沒有身份。

爲了做到這一點,你應該只需要啓用標識插入上表A.這將允許你定義在插入你的ID和只要他們不衝突,你應該罰款。然後,你可以這樣做:

Insert into A(identity, fname, lname) SELECT newid, fname, lname FROM B 

不知道你正在使用的數據庫,但SQL Server的命令來打開標識插入是:

set identity_insert A on 
4

仔細閱讀你的問題,你只是想根據表A插入結束

後,新的標識值更新表B,只是運行的更新...

UPDATE B 
SET NewID = A.ID 
FROM B INNER JOIN A 
    ON (B.FName = A.Fname AND B.LName = A.LName) 

這假定可以使用FName/LName組合鍵來匹配表之間的記錄。如果不是這種情況,您可能需要添加額外的字段以確保記錄匹配正確。

如果您還沒有備用鑰匙,可讓您意義的匹配記錄,那麼它不化妝,因爲在B表中的記錄不能從彼此區分。

0

我建議使用uniqueidentifier類型而不是身份。我這種情況下,您可以生成插入之前的ID:

update B set NewID = NEWID() 

insert into A(fname,lname,id) select fname,lname,NewID from B 
127

從2005年使用輸出中子句:

DECLARE @output TABLE (id int) 

Insert into A (fname, lname) 
OUTPUT inserted.ID INTO @output 
SELECT fname, lname FROM B 

select * from @output 

現在你的表變量插入的所有行的標識值。

相關問題