SQL Server兼容级别170下触发器用变量触发会话终止错误
问题分析与解决建议
问题场景
该问题仅特定于兼容级别170的SQL Server 2025 CU5环境:
当在INSTEAD OF UPDATE触发器中使用局部变量关联大表(200+列、10万+行的TC表)时,执行无实际数据修改的UPDATE语句(如SET bearer = bearer),会触发严重会话终止错误:
Msg 596, Level 21, State 1, Line 24
无法继续执行,因为会话处于终止状态。Msg 0, Level 20, State 0, Line 24
当前命令发生严重错误。如有结果,应予以丢弃。
复现代码
触发器代码:
CREATE OR ALTER TRIGGER CH_REPRO ON CH INSTEAD OF UPDATE AS BEGIN DECLARE @cirObj INT = 101; SELECT U.cir FROM inserted AS I LEFT JOIN TC AS U ON U.cir = I.itemno AND I.objectno = @cirObj; END;
触发错误的更新语句:
UPDATE CH SET bearer = bearer;
CH表定义(经测试与问题无关):
DROP TABLE IF EXISTS CH; CREATE TABLE CH ( bcport int, channel int, bearer int, objectno int, itemno int ); INSERT INTO CH (bcport, channel, bearer, objectno, itemno) VALUES(31,1,999,null,null);
无需重写触发器的临时解决方法
以下任一操作可直接消除错误:
- 将触发器中的局部变量
@cirObj替换为硬编码整数(如直接写101) - 用
(SELECT * FROM TC)子查询或CTE替代直接引用TC表 - 将数据库兼容级别降至160或更低
关于Bug报告
目前公开渠道暂未查询到针对该特定场景的官方Bug记录,但鉴于问题在多数据库环境中可稳定复现,且仅出现在兼容级别170下,建议通过Microsoft SQL Server官方支持渠道提交反馈,提供完整复现脚本与环境信息以推动官方修复。
内容的提问来源于stack exchange,提问作者Simon M
相关产品推荐
相关产品推荐

