SQL Server中如何在触发RAISERROR时终止后续执行流程
解决方案
默认配置下,SQL Server 遇到严重级别16的RAISERROR仅会抛出错误消息,不会自动中断后续代码执行,需要搭配额外配置或语法实现立刻终止的效果,可选择以下任意一种方案:
方案1:开启SET XACT_ABORT ON
- 该配置开启后,所有严重等级≥16的错误都会直接终止整个批处理/存储过程的执行,是最常用的解决方案。
- 修改后的测试代码:
create procedure p_testing as begin SET XACT_ABORT ON; -- 新增配置项 RAISERROR('Error is raised',16,1); insert into blah(si,name) values(1,'teasting_raiserror'); -- 触发错误后该行不会执行 END Exec p_testing
方案2:RAISERROR后显式调用RETURN
- 如果仅需要在当前存储过程内触发错误后终止,无需影响外层调用,可在
RAISERROR后直接加RETURN语句退出存储过程: - 示例代码:
create procedure p_testing as begin RAISERROR('Error is raised',16,1); RETURN; -- 直接退出当前存储过程 insert into blah(si,name) values(1,'teasting_raiserror'); -- 不会执行 END Exec p_testing
方案3:使用THROW语句替代RAISERROR(SQL Server 2012及以上版本推荐)
THROW是SQL Server 2012推出的替代RAISERROR的错误抛出语法,默认抛出错误后就会终止后续代码执行,无需额外配置:- 示例代码:
create procedure p_testing as begin THROW 50000, 'Error is raised', 1; -- 第一个参数为自定义错误号,必须≥50000 insert into blah(si,name) values(1,'teasting_raiserror'); -- 触发错误后该行不会执行 END Exec p_testing
内容的提问来源于stack exchange,提问作者Suwaid Akbar
相关产品推荐
相关产品推荐

