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

标签 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 中的错误?

谢谢, 劳尔

最佳答案

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

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

简单来说,扩展存储过程不是由数据库引擎运行的 SQL,因此您不能发出 RAISERROR。请参阅KB 190987了解更多信息

关于c++ - SQL Server 从扩展存储过程捕获错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2017212/

相关文章:

c++ - Apache C++ 模块持久全局对象

c++ - 不知道对象类型时如何实现swap函数

sql-server - 聚集索引和创建它的表都包含实际数据吗?

sql - 递归 CTE 通过经理获取员工

c - pthread_mutex_trylock() 用于等待,直到其他锁尚未释放

c++ - 使用 QMetaProperty 进行自省(introspection)

c++ - 用给定大小初始化的 std::vector 的值是什么?

sql-server - 如何从另一个 SQL 脚本中调用 SQL 脚本?

c - 如何从原始堆栈复制堆栈

c - X11 中的滚轮事件