UPDATE语句中从派生表CROSS APPLY取值到OUTPUT INTO报错求助
问题分析与解决方法
报错原因
你的UPDATE语句以派生表t作为更新目标,但派生表只是逻辑查询结果集,并非可直接修改的基表。实际被修改的是#TestTable,但SQL Server无法正确识别这种间接更新方式下inserted.OpenTimeResult的归属——引擎认为该列所属的基表#TestTable没有被当前语句直接修改,因此抛出错误。
而DELETED.OpenTimeResult能正常使用,是因为它取的是基表修改前的原始值,引擎可以直接关联到#TestTable的旧数据,不受更新目标写法的影响。
解决方法
有两种可行的改写方式:
方式一:直接更新基表
把计算逻辑整合到UPDATE的关联和SET子句中,直接以基表#TestTable作为更新目标:
UPDATE tt SET tt.OpenTimeResult = DATEADD(HOUR, tm.TimeZoneOffset, tt.OpenTimeUTC) OUTPUT inserted.OpenTimeResult INTO #OutputTable FROM #TestTable tt JOIN #TimeZoneMap tm ON tt.TimeZoneID = tm.TimeZoneID;
方式二:使用可更新CTE替代派生表
CTE基于可更新基表时,UPDATE CTE会直接修改底层基表,引擎能正确识别inserted列的归属:
WITH OpenTimeCalc AS ( SELECT tt.ID, tt.OpenTimeResult, DATEADD(HOUR, tm.TimeZoneOffset, tt.OpenTimeUTC) AS OpenTime FROM #TestTable tt JOIN #TimeZoneMap tm ON tt.TimeZoneID = tm.TimeZoneID ) UPDATE OpenTimeCalc SET OpenTimeResult = OpenTime OUTPUT inserted.OpenTimeResult INTO #OutputTable;
内容的提问来源于stack exchange,提问作者CodingIsFunYouShouldTryIt
相关产品推荐
相关产品推荐

