SQL Server 2025兼容级170触发器中外连接用变量触发会话终止错误求助
SQL Server 2025 兼容级别170下触发器外连接含变量引发会话终止错误
在SQL Server 2025兼容级别170的环境中,当触发器内使用外连接且将变量作为连接条件的一部分时,会触发错误提示:Cannot continue the execution because the session is in the kill state.
可复现问题的代码
DROP TABLE IF EXISTS TC2; CREATE TABLE [TC2]( [id_tc2] [int] IDENTITY(1,1) NOT NULL, [nme] [nvarchar](50) NOT NULL CONSTRAINT [PK_TC2] PRIMARY KEY CLUSTERED ( [id_TC2] ASC) ) ON [PRIMARY] GO INSERT INTO TC2 (nme) SELECT 'testing_'+CAST(N.[value] as nvarchar(10)) FROM GENERATE_SERIES (1,1000) AS N; GO CREATE OR ALTER VIEW CH AS SELECT bcport=31, channel=1, bearer=99, objectno = cast(null as int), itemno=cast (null as int); GO DROP TABLE IF EXISTS OTHER; CREATE TABLE OTHER( id_other int identity(1,1) , id_tc2 int , bcport int , whn datetime , [status] nvarchar(20) CONSTRAINT [PK_OTHER] PRIMARY KEY CLUSTERED ( [id_other] ASC) ) ON [PRIMARY]; GO CREATE OR ALTER TRIGGER CH_REPRO ON CH INSTEAD OF UPDATE AS BEGIN DECLARE @circObj INT = 101; UPDATE O SET [status]=CASE WHEN U.id_tc2 is null THEN 'unused' ELSE 'used' END , whn=GETDATE() FROM OTHER AS O INNER JOIN inserted AS I on I.bcport=O.bcport LEFT JOIN TC2 AS U ON U.id_tc2 = I.itemno AND I.objectno = @circObj; END; GO UPDATE CH SET bearer = bearer;
临时解决方案
经测试,以下任意一种方式可消除错误:
- 将数据库兼容级别设置为160或更低;
- 使用硬编码值替代变量(如将
I.objectno=@circObj改为I.objectno=1234); - 在连接中使用子查询替代直接引用TC2表(如
LEFT JOIN (SELECT * FROM TC2) AS U)。
疑问
Bing AI显示该问题为已知且已修复的Bug,但无法找到相关官方参考资料,且在SQL Server 2025累积更新5(CU5)中仍可复现该问题。询问是否有其他用户遇到过此问题,或了解相关的Bug报告信息。
内容的提问来源于stack exchange,提问作者Simon M
相关产品推荐
相关产品推荐

