SQL Server存储过程UPDATE依赖字段仅第二次执行才赋值,如何单次更新完成
问题原因
SQL Server 的UPDATE语句遵循所有赋值操作基于更新前的行快照的执行逻辑,和SET子句的书写顺序无关。你在SET里给tbl1.field_1赋的新值,不会在同一次UPDATE的后续赋值里生效,field_2计算时读取的永远是本次UPDATE执行前tbl1.field_1的旧值。
第一次执行时field_1还是旧值(比如NULL、历史残留值),所以field_2计算结果不符合预期;第二次执行时field_1已经是第一次更新后的正确值,所以field_2才能算出正确结果。
解决方案
直接复用field_1的计算逻辑,或者提前计算好所有值再更新即可,单次执行就能完成所有字段更新:
方案1:直接使用关联表的源字段计算field_2(最简便)
UPDATE tbl1 SET -- other columns tbl1.field_1 = CONVERT(datetime, CONVERT(varchar(10), carsAll.DateOfBirth, 104)), tbl1.field_2 = DATEPART(YEAR, GETDATE()) - DATEPART(YEAR, CONVERT(datetime, CONVERT(varchar(10), carsAll.DateOfBirth, 104))), -- other columns FROM [db1].[cars].[table_1] AS tbl1 INNER JOIN [db2].[cars].[carsAll_test] AS carsAll ON tbl1.[TP_PK]=carsAll.[TP_PK]
方案2:用CTE提前计算所有衍生值(逻辑更清晰,适合重复计算多的场景)
WITH update_data AS ( SELECT tbl1.TP_PK, CONVERT(datetime, CONVERT(varchar(10), carsAll.DateOfBirth, 104)) AS calc_field1, DATEPART(YEAR, GETDATE()) - DATEPART(YEAR, CONVERT(datetime, CONVERT(varchar(10), carsAll.DateOfBirth, 104))) AS calc_field2 -- 其他需要计算的字段 FROM [db1].[cars].[table_1] AS tbl1 INNER JOIN [db2].[cars].[carsAll_test] AS carsAll ON tbl1.[TP_PK]=carsAll.[TP_PK] ) UPDATE tbl1 SET field_1 = ud.calc_field1, field_2 = ud.calc_field2 -- 其他字段 FROM [db1].[cars].[table_1] AS tbl1 INNER JOIN update_data ud ON tbl1.TP_PK = ud.TP_PK
内容的提问来源于stack exchange,提问作者Hrvoje
相关产品推荐
相关产品推荐

