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

T-SQL UPDATE列赋值顺序问题:为何更新后Val值为5而非10

问题复现

执行如下T-SQL代码后,临时表#tmp中Val字段的实际取值为5,不符合预期的10:

create table #tmp(Val int)
insert into #tmp values(1)

declare @i int = 10
update #tmp set Val = @i,  @i = 5

select * from #tmp
原因说明

造成这个结果的核心原因是SQL Server中UPDATE语句SET子句的特殊执行逻辑:

  • 当SET子句内同时存在表字段赋值和局部变量赋值操作时,SQL Server实际按照从右到左的顺序逐行执行赋值,而非多数人默认认知的从左到右顺序。
  • 示例语句中SET Val = @i, @i = 5的执行流程为:先执行最右侧的@i = 5,将初始值为10的局部变量@i修改为5;之后才执行左侧的Val = @i赋值,此时@i已经是更新后的5,因此Val最终被赋值为5。
  • 微软官方明确不推荐在UPDATE语句中混用字段赋值和变量赋值,该执行顺序不属于正式文档承诺的固定逻辑,存在跨版本行为不一致的风险。

内容的提问来源于stack exchange,提问作者Máté Farkas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 11:09:28