2008-09-18 34 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 

现在你的表变量插入的所有行的标识值。

相关问题