如何在存储过程中途退出?
我有一个存储过程,我想在其中提早退出(同时尝试对其进行调试)。我尝试调用RETURN
和RAISERROR
,但sp仍在运行:
CREATE PROCEDURE dbo.Archive_Session @SessionGUID uniqueidentifier AS
print 'before raiserror'
raiserror('this is a raised error', 18, 1)
print 'before return'
return -1
print 'after return'
[snip]
我知道它一直在运行,因为我在下面遇到了一个错误。我没有看到任何我的指纹。如果我注释掉存储过程的大部分:
CREATE PROCEDURE dbo.Archive_Session @SessionGUID uniqueidentifier AS
print 'before raiserror'
raiserror('this is a raised error', 18, 1)
print 'before return'
return -1
print 'after return'
/*
[snip]
*/
然后我没有得到我的错误,我看到了结果:
before raiserror
Server: Msg 50000, Level 18, State 1, Procedure Archive_Session, Line 5
this is a raised error
before return
所以问题是:如何从SQL Server中的存储过程中解脱出来?
发布于 2009-12-08 05:13:17
您可以使用RETURN
立即停止执行存储过程。引用自Books Online
从查询或过程中无条件退出。返回是立即和完整的,并且可以在任何时候用于退出过程、批处理或语句块。不执行RETURN后面的语句。
出于偏执,我尝试了你的例子,它确实输出了打印结果,并立即停止执行。
发布于 2009-12-08 05:10:29
除非将严重性指定为20或更高,否则raiserror
不会停止执行。请参阅MSDN documentation。
通常的解决方法是在每个raiserror
后面都包含一个return
if @whoops = 1
begin
raiserror('Whoops!', 18, 1)
return -1
end
发布于 2009-12-08 05:10:08
将其放入TRY/CATCH
中。
当RAISERROR在TRY块中以11或更高的严重性运行时,它会将控制转移到关联的CATCH块
参考:MSDN。
MSSQL:这适用于 2005+,但我看到您现在已经澄清了您正在使用MSSQL2000。我把这个留在这里作为参考。
https://stackoverflow.com/questions/1862871
复制相似问题