如何在INSERT INTO SELECT执行后更新[From]表的picId外键?
解决方法
首先纠正你原查询里的一个错误:outer apply中应该取dbo.[To]的最大Id而非pic,否则基于二进制的pic值计算新Id会导致逻辑错误。
接下来可以通过表变量+OUTPUT子句捕获插入的To表Id,再关联更新From表的picId,具体代码如下:
-- 定义表变量存储插入的To表Id和对应的From表Id DECLARE @InsertedIds TABLE (FromId INT, ToId INT); -- 插入数据到To表,同时捕获关联的Id映射 INSERT INTO dbo.[To] (Id, pic) OUTPUT F.Id, inserted.Id INTO @InsertedIds(FromId, ToId) SELECT ISNULL(T.MaxToId, 0) + ROW_NUMBER() OVER (ORDER BY F.Id), -- 建议按From表主键排序,避免pic重复导致顺序混乱 F.pic FROM dbo.[From] AS F OUTER APPLY (SELECT MAX(Id) AS MaxToId FROM dbo.[To]) AS T; -- 关联更新From表的picId字段 UPDATE F SET F.picId = I.ToId FROM dbo.[From] F INNER JOIN @InsertedIds I ON F.Id = I.FromId;
关键说明
- OUTPUT子句:在插入
To表时,同步把From表的主键Id和新生成的To表Id存入表变量,建立两者的映射关系。 - 排序逻辑:原查询按
F.pic排序,若存在重复的pic值,可能导致row_number()生成的Id顺序不可预测,建议改用F.Id(From表主键)排序,保证每个From记录对应唯一且确定的To记录。 - 关联更新:通过表变量中的
FromId(即原From表的主键)关联,精准更新对应记录的picId。
内容的提问来源于stack exchange,提问作者zTim
相关产品推荐
相关产品推荐

