You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server更新行数据时默认是整行更新还是逐列更新?

SQL Server UPDATE语句赋值规则说明

你测试观察到的现象是SQL Server明确定义的默认确定性行为,不存在结果不确定的问题,也不需要额外添加任何设置来触发。
核心规则如下:

  • 单条UPDATE语句的SET子句中,所有赋值表达式右侧引用的字段,取的都是语句启动时对应行的原始存储值,和SET子句内的字段书写顺序完全无关,不会出现“先赋值的字段值被同语句后续赋值逻辑引用”的情况。

对你测试的语句来说,执行逻辑是完全固定的:

UPDATE CharacterInfo 
SET ChaRating = floor((ChaRating + ChaOldRating)/2),
    ChaOldRating = ChaRating

执行步骤为:

  1. 读取待更新行的ChaRating、ChaOldRating原始值
  2. 用两个原始值计算floor((ChaRating + ChaOldRating)/2),作为ChaRating的新值
  3. 将第一步读取到的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 06:27:24