SQL Server更新行数据时默认是整行更新还是逐列更新?
SQL Server UPDATE语句赋值规则说明
你测试观察到的现象是SQL Server明确定义的默认确定性行为,不存在结果不确定的问题,也不需要额外添加任何设置来触发。
核心规则如下:
- 单条
UPDATE语句的SET子句中,所有赋值表达式右侧引用的字段,取的都是语句启动时对应行的原始存储值,和SET子句内的字段书写顺序完全无关,不会出现“先赋值的字段值被同语句后续赋值逻辑引用”的情况。
对你测试的语句来说,执行逻辑是完全固定的:
UPDATE CharacterInfo SET ChaRating = floor((ChaRating + ChaOldRating)/2), ChaOldRating = ChaRating
执行步骤为:
- 读取待更新行的
ChaRating、ChaOldRating原始值 - 用两个原始值计算
floor((ChaRating + ChaOldRating)/2),作为ChaRating的新值 - 将第一步读取到的
ChaRating原始值赋值给ChaOldRating,不会引用第二步算出的新ChaRating
这个逻辑就是通常说的“整行更新”语义,SQL Server默认就采用该模式,不需要在存储过程中添加任何特殊SET选项、提示语句来开启,所有执行环境下结果一致。
如果你的业务需求是让SET子句中后续的赋值逻辑引用同语句前面计算出的字段新值,默认的取值规则不支持该场景,可以通过CTE/派生表预计算新值的方式实现,逻辑同样是确定性的,示例如下:
WITH PreCalc AS ( SELECT ChaRating, ChaOldRating, FLOOR((ChaRating + ChaOldRating)/2) AS NewChaRating FROM CharacterInfo -- 按需添加WHERE条件筛选待更新行 ) UPDATE PreCalc SET ChaRating = NewChaRating, ChaOldRating = NewChaRating -- 此处引用的就是计算完成的新ChaRating值
内容的提问来源于stack exchange,提问作者Azriel Elijay
相关产品推荐
相关产品推荐

