RAISERROR 抛出的错误未进入 CATCH 块

今天写了一个储存过程,希望当出错时通过 RAISERROR 抛出错误进入 CATCH 块,代码如下:

create procedure dbo.mp_CancelKHExport
	@ExpUID CHAR(16),
	@UserName VARCHAR(30),
	@Result BIT OUTPUT,
	@ErrMsg NVARCHAR(250) OUTPUT
as
begin
	declare @trancount int
	select @trancount=@@TRANCOUNT, @Result=0, @ErrMsg=''
	
	BEGIN TRY
		BEGIN TRAN
			declare @ExpType VARCHAR(50)
			select @ExpType=ExportType from XHExportInfo where UID=@ExpUID and Active=1
			
			print 'exptype=' + coalesce(@exptype, '不存在')
			
			if @ExpType='StampP'
				exec dbo.mp_CancelStampP @ExpUID, @Result output, @ErrMsg output
			else if @ExpType is null
				raiserror('该导出不存在或者已经被撤销了', 10, 1)
			else
				raiserror('尚未实现该功能', 10, 1)
					
			update XHExportInfo set Active=0, Remark=dbo.mfn_FormatDateTime(getdate(), 'Y-M-D H:N:S') + ' 被 ' + @UserName + ' 撤销'	
				where UID=@ExpUID
		COMMIT TRAN	
		select @Result=1, @ErrMsg='--'
	END TRY
	BEGIN CATCH
		if @@TRANCOUNT>@trancount
			ROLLBACK TRAN
		select @Result=0, @ErrMsg=ERROR_MESSAGE()		
	END CATCH
end

但是,测试时发现当执行到:

else if @ExpType is null
	raiserror('该导出不存在或者已经被撤销了', 10, 1)
执行 raiserror('该导出不存在或者已经被撤销了', 11, 1) 之后,并没有跳转到 BEGIN CATCH 块中,而是继续执行了  select @Result=1, @ErrMsg='--',并且,RAISERROR 所抛出的错误还输出到控制台查询 MSDN 发现,有这样一段说明:如果在 TRY...CATCH 构造的 TRY 块中执行的 RAISERROR 严重度介于 11 到 19 之间,会导致将控制传递到关联的 CATCH 块。如果指定 10 或更低的严重度,将使用 RAISERROR 返回消息,而不调用 CATCH 块。PRINT 不会将控制传输到 CATCH 块。原因就是严重程度小于11,将其改为RAISERROR('该导出不存在或者已经被撤销了', 11, 1)即可解决。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值