如何插入多条记录并获取标识值?

Dwi*_*t T 54 sql sql-server sql-server-2005

我正在从另一个表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
Run Code Online (Sandbox Code Playgroud)

我正在使用MS SQL Server 2005.

And*_*ing 147

使用2005年的ouput条款:

DECLARE @output TABLE (id int)

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

select * from @output
Run Code Online (Sandbox Code Playgroud)

现在,您的表变量具有您插入的所有行的标识值.

  • 但那么你如何更新表B?我的意思是,你如何将@output的每条记录与B中的记录联系起来?如果您使用fname,lname作为键,则使用njr的解决方案更简单. (5认同)
  • @munissor,我知道这是一个老线程,但请查看[这篇简单的文章](http://www.simple-talk.com/sql/learn-sql-server/working-with-the-insert-关于这个主题的声明在-sql-server /).请查看"添加OUTPUT子句"部分. (2认同)
  • @munissor 有点晚了,但你可以做`output插入.id,插入.whateverColumn到@output` (2认同)

njr*_*101 5

仔细阅读您的问题,您只想根据表A中的新标识值更新表B.

插入完成后,只需运行更新...

UPDATE B
SET NewID = A.ID
FROM B INNER JOIN A
     ON (B.FName = A.Fname AND B.LName = A.LName)
Run Code Online (Sandbox Code Playgroud)

这假定FName/LName组合可用于键匹配表之间的记录.如果不是这种情况,您可能需要添加额外的字段以确保记录正确匹配.

如果您没有允许您匹配记录的备用密钥,则它根本没有意义,因为表B中的记录无法彼此区分.


Mef*_*eff -7

MBelly 是对的 - 但是触发器总是会尝试更新表 B,即使这不是必需的(因为您也从表 C 插入?)。

达伦在这里也是正确的,你无法将多个身份作为结果集返回。您的选择是使用游标并获取插入的每一行的标识,或者使用 Darren 的方法来存储前后的标识。只要您知道身份的增量,只要您确保表针对所有三个事件都被锁定,这就应该起作用。

如果是我,而且时间不紧的话,我会使用光标。