如何插入多个logging并获取身份值?

我从另一个表B插入多个logging到表A中。有没有办法获得表A的logging的身份值和更新表B的logging与做游标吗?

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。

MBelly是正确的钱 – 但是,然后触发器将总是尝试和更新表B即使不需要(因为你也从表C插入?)。

达伦在这里也是正确的,你不能得到多个身份的结果集。 你的选项是使用游标,并为每一行插入的身份,或使用达伦的方法来存储身份前后。 只要你知道这个身份的增量应该起作用,只要你确保这个表被locking了所有三个事件。

如果是我,那不是时间的关键,我会用光标去。

使用2005年的输出条款:

 DECLARE @output TABLE (id int) Insert into A (fname, lname) OUTPUT inserted.ID INTO @output SELECT fname, lname FROM B select * from @output 

现在您的表variables具有您插入的所有行的标识值。

仔细阅读你的问题,你只是想根据表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组合键来匹配表之间的logging。 如果不是这种情况,您可能需要添加额外的字段以确保logging匹配正确。

如果你没有一个可以让你匹配logging的备用密钥,那么它根本就没有意义,因为表B中的logging不能相互区分。

如果您始终需要此行为,则可以在TableA上放置一个AFTER INSERT触发器来更新表B.

你可以通过join行号来获得。 这是可能的,因为它是一个身份,它只会增加你添加的项目,这将按照你select的顺序。

据我所知,你遇到的问题是,你想要插入到表A,它有一个标识列,并且你想保留表B的身份,而不是。

为了做到这一点,你只需要打开表A上的身份插入。这将允许您在插入时定义您的ID和只要他们不冲突,你应该没问题。 那么你可以做:

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

不知道你正在使用什么数据库,但对于SQL服务器打开身份插入的命令将是:

 set identity_insert A on 

我build议使用uniqueidentifiertypes而不是身份。 我这种情况下,你可以在插入之前生成ID:

 update B set NewID = NEWID() insert into A(fname,lname,id) select fname,lname,NewID from B