首页 > 解决方案 > 在 sql server 中发生不可提交事务的情况下如何获取实际错误?

问题描述

我正在从另一个从内部调用另一个 sp 的 sp 调用 sp。例如 sp1->sp2->sp3 我在所有这些中都使用了 TRY-CATCH。我在 sp3 中显式地引发了一个错误,然后在 try-catch 中捕获,然后再次引发它,在 sp2 中捕获它,然后再次引发它,然后在 sp3 中捕获它。这工作正常。

但是,当我在最外层 sp1 上添加 BEGIN TRAN 时。我得到当前事务无法提交,并且无法支持写入日志文件的操作。回滚事务。错误。

我想要的是捕获导致问题的实际错误而不是这个错误。此错误消息是实际错误的影响。为什么它根本没有告诉我导致当前事务不可提交的实际错误?

我搜索了很多并阅读了很多关于这个错误的帖子,但没有一个回答我的问题,因为几乎每个答案或问题主要是关于通过使用 XACT_STATE 来确定是回滚还是提交事务来处理这个错误。但是,就我而言,我只是在出现任何错误的情况下回滚。

例如 BEGIN TRY BEGIN TRAN

    EXEC sp2

    COMMIT TRAN
    END TRY
    BEGIN CATCH
        SELECT ERROR_MESSAGE()
        SELECT @@TRANCOUNT > 0
        ROLLBACK
    END CATCH

例如,我在 sp3 RAISERROR('Catching errors from sp3 for testing...', 11, 2) 中添加了这一行

现在在事务中调用 sp1 应该会给我这个特殊的错误,所以我可以处理它。

但是,如果我从最外面的 sp3 中删除 BEGIN TRAN,那么我会得到实际的错误并且工作正常。

标签: sqlsql-serverazure-sql-database

解决方案


推荐阅读