SQL Server从扩展存储过程捕获错误

时间:2010-01-06 23:48:08

标签: c++ sql-server c stored-procedures error-handling

您好我有一个发送错误消息的扩展存储过程。

srv_sendmsg(pSrvProc, SRV_MSG_ERROR, errorNum, SRV_FATAL_SERVER, 1,
            NULL, 0, (DBUSMALLINT) __LINE__, 
            buff,
            SRV_NULLTERM);

我已将严重性设置为SVR_FATAL_SERVER,只是作为测试,看看我是否可以使该消息在sql中引发异常。

在我的SQL中我正在做:

BEGIN TRY
    EXEC dbo.xp_somethingCool
    SET @Error = @@ERROR
END TRY
BEGIN CATCH
    PRINT 'AN Error occoured!'
    SELECT ERROR_NUMBER() AS ErrorNumber
          ,ERROR_MESSAGE() AS ErrorMessage;
END CATCH

我认为当我的xp发送错误消息时,tsql会捕获错误并选择error_number和error_message。相反,最终发生的事情是xp发送消息并且T-SQL继续运行,就像没有发生任何事情一样。 @@ Error变量也未设置。

所以我想知道是否有任何技巧让SQL从XP中捕获错误?

谢谢, 劳尔

3 个答案:

答案 0 :(得分:0)

您应该可以使用RAISERROR来抛出异常。

每条评论:你没有创建自己的扩展存储过程吗?如果是这样,您可以使用throw或执行类似1/0的操作来抛出异常。

答案 1 :(得分:0)

永远不要提高任何东西。任何高于16的严重性都会中止批处理,因此您的T-SQL catch块永远不会有机会运行。与SVR_FATAL_SERVER一样高的东西会立即关闭服务器。

答案 2 :(得分:0)

您只能测试扩展存储过程的结果,并使用它来抛出异常。

...
EXEC @rtn = dbo.xp_somethingCool
IF @rtn <> 0
    RAISERROR ...
...

非常简单术语中,扩展存储过程不是由数据库引擎运行的SQL,因此您不能发出RAISERROR。有关更多信息,请参阅KB 190987