我从另一个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,那么我会收到实际的错误并且可以正常工作。