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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 19:54:03