sql - 存储过程错误 EXECUTE 表示 BEGIN 和 COMMIT 语句的数量不匹配
问题描述
我有一个存储过程,当我删除 Select 1/0 时它工作正常(这是为了测试存储过程是否捕获错误)但是当我在存储过程中有 Select 1/0 时,它会引发错误
EXECUTE 之后的事务计数表明 BEGIN 和 COMMIT 语句的数量不匹配。先前计数 = 0,当前计数 = 1
我尝试了TSQL Try / Catch in Transaction 的应用解决方案,反之亦然?但我仍然得到同样的错误。
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
解决方案
由于您当前的设置不允许您进行COMMIT
交易,因此您需要将 a 添加COMMIT
到TRY
块中,并将 移动ROLLBACK
到CATCH
块中。像下面这样的东西。再次阅读Erland关于错误处理的冗长博客,以了解更好的方法和您应该包括的其他内容,例如SET XACT_ABORT ON
:
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
COMMIT TRAN test1
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN test1
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
推荐阅读
- yii2 - yii2如何设置全局访问控制?
- c# - Nuget List CLI 命令显示已删除的包
- sql-server - 查找没有匹配信用的发票
- javascript - PHP/Javascript - 使用 Stripe API 添加支付方式
- java - 如何使用 JSON 以声明顺序序列化带有枚举键的映射?
- java - 从数组中删除元素并使用嵌套循环移动剩余元素?
- python-3.x - 完全被 PyCharm 环境弄糊涂了
- javascript - 根据喜欢增加图像宽度并显示当前的 Prozent
- python - 在python中实现快速排序,最后一个元素作为枢轴
- python - 在 Tinkerpop 中使用 Python 创建用于图形处理的程序的可能性