LOGO 首页 OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 技术文档 其他文档  
 
网站管理员

SQL Server 数据库中批量加入的 SQL 不会严格按顺序执行?

admin
2026年9月22日 15:32 本文热度 54

:SQL Server 数据库中批量加入的 SQL 不会严格按顺序执行?

例子如下:

update scm_deliver_goods_order_list set invoice_order_id='',invoice_order_price_f='0',invoice_notax_order_price_f='0',invoice_order_status='4',invoice_order_inputor='sunjingyi',invoice_order_input_time='',invoice_time='' where id='317168'; update scm_deliver_goods_order_list set invoice_order_id='XSFP260819011',invoice_notax_order_price_f='0.36',invoice_order_price_f='0.4068',invoice_order_status='1',invoice_order_inputor='sunjingyi',invoice_order_input_time='2026-08-21',invoice_time='2026-8-21',invoice_order_source_type=0 where id='317168';

结论先说

在同一个批里,两条 UPDATE 语句,SQL Server 是会按书写顺序依次执行的,但你这个案例有个坑:操作同一行同一条记录,连续两次 update,前面那条会被后面那条直接覆盖,不是乱序,是先后覆盖。

注意区分两个概念:

  1. 一个批内多条独立语句(分号分隔):按代码书写顺序执行

  2. 单条语句内部的行更新:更新多行时,各行之间没有固定执行顺序(这个才是大家常说 “不按顺序” 的场景)

你的两条 SQL 拆解

-- 第1条
update scm_deliver_goods_order_list 
set invoice_order_id='',invoice_order_price_f='0',invoice_notax_order_price_f='0',
invoice_order_status='4',invoice_order_inputor='sunjingyi',invoice_order_input_time='',invoice_time='' 
where id='317168'; 
-- 第2条
update scm_deliver_goods_order_list 
set invoice_order_id='XSFP260819011',invoice_notax_order_price_f='0.36',invoice_order_price_f='0.4068',
invoice_order_status='1',invoice_order_inputor='sunjingyi',invoice_order_input_time='2026-08-21',invoice_time='2026-8-21',invoice_order_source_type=0 
where id='317168';

执行流程:

  1. 先执行第 1 条:id=317168 这一行被改成 invoice_order_status='4',其他字段清空 / 置 0

  2. 紧接着马上执行第 2 条:同一行,直接覆盖,status 改成1,回填发票信息

👉 最终结果:第一条的效果完全看不见,被第二条覆盖。 不是 SQL 乱序,是先后两次修改同一行。

什么时候 SQL 会 “看起来不按顺序”?

场景 1:单条 UPDATE 更新多行(最常见误区)

update table set col=xx where id in (1,2,3,4)

这一条语句内部,id=1、2、3、4 这几行,数据库内部更新顺序不保证,优化器选择扫描顺序决定,不是按 in 里面的顺序。

✅ 多条语句(多个 update,分号隔开):语句和语句之间顺序保证 ❌ 单条语句,一次性更新多行:行之间无顺序保证

场景 2:跨批次、并行执行、触发器

  • 放到不同 GO 分隔的批,或多连接并发执行,顺序完全不受控

  • 更新表有触发器,触发器内部逻辑会穿插执行,容易误以为主 SQL 乱序

你这个需求正确写法

既然是同一行,不需要两次 update,合并成一条 update即可:

update scm_deliver_goods_order_list 
set invoice_order_id='XSFP260819011',
    invoice_order_price_f='0.4068',
    invoice_notax_order_price_f='0.36',
    invoice_order_status='1',
    invoice_order_inputor='sunjingyi',
    invoice_order_input_time='2026-08-21',
    invoice_time='2026-08-21',
    invoice_order_source_type=0 
where id='317168';

如果你确实必须先置空、再赋值(中间要做日志 / 触发器捕获中间状态),那要加事务,并且中间加延迟或者拆分两个批次,但一般业务场景完全没必要,直接合并。

补充:事务下的顺序

如果包在事务里:

begin tran
update ... where id=317168; --语句1
update ... where id=317168; --语句2
commit

依然按书写顺序执行,只是所有修改直到 commit 才对其他会话可见。事务只保证原子性,不改变同批语句执行顺序。


一句话总结

✅ 多条独立 UPDATE 语句(分号隔开):语句顺序一定按你写的来 

​❌ 单条 UPDATE 一次性更新多条记录:行与行之间更新顺序不保证 

你这个案例,不是乱序,是先后两次更新同一行,后执行的覆盖前面的修改。


该文章在 2026/9/22 15:37:27 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved  粤ICP备13012886号-9  粤公网安备44030602007207号