我有一个存储过程,当我删除Select 1/0(这是为了测试存储过程是否捕获错误)时工作正常,但是当我在存储过程中有Select 1/0时,它将引发错误
EXECUTE之后的事务计数表明BEGIN和COMMIT语句的数量不匹配。上一个计数= 0,当前计数= 1
我尝试了TSQL Try / Catch within Transaction or vice versa?的套用解决方案,但仍然出现相同的错误。
ALTER PROCEDURE [dbo].[PTA_Processing_D365]
AS
BEGIN TRY
BEGIN TRANSACTION test1
UPDATE table A
....
......
......;
INSERT INTO table A(.....)
SELECT .....
FROM table b
WHERE .....;
SELECT 1/0
ROLLBACK TRANSACTION test1
END TRY
BEGIN CATCH
INSERT INTO tableA_ErrorLog ([ExecutedDate], [ERROR_NUMBER], [ERROR_SEVERITY],
[ERROR_STATE], [ERROR_PROCEDURE], [ERROR_LINE], [ERROR_MESSAGE])
SELECT
GETDATE(), ERROR_NUMBER(), ERROR_SEVERITY(),
ERROR_STATE(), ERROR_PROCEDURE(), ERROR_LINE(), ERROR_MESSAGE()
END CATCH
答案 0 :(得分:2)
由于您当前的设置不允许您进行COMMIT
交易,因此您需要向COMMIT
块添加TRY
并移动{{1 }}到ROLLBACK
块。如下所示。再次,请阅读Erland's lengthy blog的错误处理信息,以寻求更好的方法和应添加的其他内容,例如CATCH
:
SET XACT_ABORT ON