C++ 扩展存储过程中的SQL Server捕获错误

C++ 扩展存储过程中的SQL Server捕获错误,c++,sql-server,c,stored-procedures,error-handling,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); 我将severity设置为SVR_FATAL_SERVER,以测试是否可以导致消息在sql中引发异常 在我的SQL中,我正在做: BEGI

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

srv_sendmsg(pSrvProc, SRV_MSG_ERROR, errorNum, SRV_FATAL_SERVER, 1,
            NULL, 0, (DBUSMALLINT) __LINE__, 
            buff,
            SRV_NULLTERM);
我将severity设置为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将捕获错误并选择错误号和错误消息。相反,最终发生的是xp发送消息,而T-SQL继续前进,就像什么都没发生一样。@@Error变量也未设置

所以我想知道是否有什么技巧可以让SQL捕捉XP中的错误

谢谢, Raul

您应该能够使用抛出异常

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

根据注释:您不是在创建自己的扩展存储过程吗?如果是这样的话,您可以使用throw或执行类似于1/0的操作来抛出异常。

千万不要抛出这么高的值。严重性高于16的任何事件都将中止批处理,因此您的T-SQL catch块永远没有机会运行。高达SVR\u FATAL\u SERVER的内容将立即关闭服务器。

您只能测试扩展存储过程的结果,并使用该结果引发异常

...
EXEC @rtn = dbo.xp_somethingCool
IF @rtn <> 0
    RAISERROR ...
...
。。。
EXEC@rtn=dbo.xp\u一些很酷的东西
如果@rtn 0
错误。。。
...

简单地说,扩展存储过程不是由数据库引擎运行的SQL,因此不能发出错误。有关更多信息,请参见Microsoft建议您不再使用
srv\u sendmsg
。请参阅问题中的警告:如何在扩展存储过程中引发错误?我不反对,但当它从xp中引发时,它似乎被忽略,这就是我这样做的原因。我想看看它是否真的起了作用。我不知道是否有另一个api调用可用于使sql server实际处理该消息,或者我是否缺少一个标志?我不记得确切的情况,但可能是为了保护您自己而限制了严重性。试着在测试中使用16。