【发布时间】:2008-09-18 19:24:11
【问题描述】:
我正在从另一个表 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。
【问题讨论】:
-
安迪欧文的回答是最好的。触发器很笨拙,不适用于目标表上的任意操作,尤其是当您的目标是临时的或只是中间的时。达伦的回答是错误的,如果您要插入一组行,它们在目标表中的顺序不一定与您的集合的顺序相同。 Dmitry 的方式很糟糕,因为它需要一次循环插入一行,这在性能方面很慢,尽可能使用集合。科里的做法很糟糕,他解释了原因,“只要他们不冲突。”这将变成星期六晚上 c
-
我意识到这是一个老问题,它指定了 SQL Server 2005,但由于它是显示 2008 年可用的 MERGE 语句的第一个结果,以后应该提到那些寻找解决方案的人。 MERGE INTO TargetTable USING (SELECT....) AS Source ON 1 = 2 WHEN NOT MATCHED THEN INSERT.... OUTPUT inserted.ID INTO TempTable (InsertedID)
-
简单插入不需要合并。合并对于插入/更新很有用,但对于简单的插入来说就大材小用了。 Andy 的输出答案对我有用,并帮助取消了索引锁。
-
如果您要插入相关项目,您可能需要
MERGE和OUTPUT,因此需要一个像 (FakeID, IdentityID) 这样的映射表来了解哪个 fakeid 映射到结果IDENTITY价值。
标签: sql sql-server sql-server-2005