能否通过T-SQL的OUTPUT子句在MERGE时更新临时表ID字段?
问题解答
是的,可以通过MERGE结合OUTPUT子句在同一条语句流程里完成临时表ID字段的更新。
具体实现逻辑是:先利用MERGE的OUTPUT子句,把目标数据库表生成的自增ID,和源临时表的唯一标识(比如Table1Code)一起捕获到一个中间表变量中,再通过这个中间表变量关联更新原临时表的ID字段。虽然OUTPUT子句不能直接修改现有表,但可以先输出到中间存储,再一次性完成关联更新,整体属于同一段逻辑的连续执行,能达到你想要的“合并操作同时更新临时表ID”的效果。
针对@Table1的具体代码示例:
-- 定义中间表变量,存储生成的自增ID和对应的源表唯一标识 DECLARE @InsertedIDs TABLE (NewTable1ID INT, SourceTable1Code VARCHAR(5)) MERGE INTO dbo.Table1 AS Target USING @Table1 AS Source ON 1 = 0 -- 强制执行插入逻辑(因为源临时表无ID,这里只做新增) WHEN NOT MATCHED THEN INSERT (Table1Description, Table1Code) VALUES (Source.Table1Description, Source.Table1Code) OUTPUT inserted.Table1ID, Source.Table1Code INTO @InsertedIDs; -- 关联中间表,更新原临时表的ID字段 UPDATE t SET t.Table1ID = i.NewTable1ID FROM @Table1 t JOIN @InsertedIDs i ON t.Table1Code = i.SourceTable1Code;
这段代码的执行流程:
- 通过MERGE将
@Table1的数据插入正式库表dbo.Table1,同时把生成的自增ID和源临时表的Table1Code存入中间表@InsertedIDs - 利用
Table1Code作为关联键,把自增ID同步回原临时表@Table1的Table1ID字段
相同逻辑可以直接复用在@Table2上,完成后就能用更新后的临时表ID处理@Relationships的关联数据插入了。
内容的提问来源于stack exchange,提问作者Ian Boggs
相关产品推荐
相关产品推荐

