在SQL Server中发生不可提交的事务时,如何获取实际错误?

时间:2019-06-18 13:15:43

标签: sql sql-server azure-sql-database

我从另一个sp调用一个sp,而另一个sp从内部调用另一个sp。例如sp1-> sp2-> sp3 我都用过TRY-CATCH。 我在sp3中显式引发错误,然后在try-catch中捕获,然后再次引发,在sp2中捕捉,然后再次引发,然后在sp3中捕捉。效果很好。

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

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

我在Google上搜索了很多内容,并阅读了许多有关此错误的文章,但没有一个回答我的问题,因为几乎每个答案或问题都主要是通过使用XACT_STATE确定是回滚还是提交事务来处理此错误。但是,就我而言,我只是在发生任何错误时回滚。

例如  开始尝试         开始翻译

    EXEC sp2

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

例如 我在sp3中添加了这一行 RAISERROR('从sp3捕获错误以进行测试...',11,2)

现在在事务中调用sp1应该会给我这个特殊错误,因此我可以对其进行处理。

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

0 个答案:

没有答案