在存储过程中,我们一般会用 raiserror来抛出存储过程中的异常,但如果你在这之后,又用了 return 参数的话,在外部就无法捕捉到此异常了。

比如

捕捉动态执行存储过程的异常(MSSQL)create proc #t1
捕捉动态执行存储过程的异常(MSSQL)
as
捕捉动态执行存储过程的异常(MSSQL)  
select '1'
捕捉动态执行存储过程的异常(MSSQL)  
declare @errorid int
捕捉动态执行存储过程的异常(MSSQL)  
set @errorid = 1
捕捉动态执行存储过程的异常(MSSQL)  
raiserror(@errorid161)
捕捉动态执行存储过程的异常(MSSQL)  
return @errorid
捕捉动态执行存储过程的异常(MSSQL)

我们用
捕捉动态执行存储过程的异常(MSSQL)exec('#t1')
捕捉动态执行存储过程的异常(MSSQL)
捕捉动态执行存储过程的异常(MSSQL)
print @@error

显示的结果是 0



捕捉动态执行存储过程的异常(MSSQL)alter proc #t2
捕捉动态执行存储过程的异常(MSSQL)
as
捕捉动态执行存储过程的异常(MSSQL)  
select '1'
捕捉动态执行存储过程的异常(MSSQL)  
declare @errorid int
捕捉动态执行存储过程的异常(MSSQL)  
set @errorid = 1
捕捉动态执行存储过程的异常(MSSQL)  
raiserror(@errorid161)
捕捉动态执行存储过程的异常(MSSQL)  
return 


我们用
捕捉动态执行存储过程的异常(MSSQL)
捕捉动态执行存储过程的异常(MSSQL)
exec('#t1')
捕捉动态执行存储过程的异常(MSSQL)
捕捉动态执行存储过程的异常(MSSQL)
print @@error

得到的结果,是存储过程中正确抛出的值。

相关文章: