【问题标题】:Error "Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements"错误“EXECUTE 后的事务计数表明 BEGIN 和 COMMIT 语句的数量不匹配”
【发布时间】:2018-03-11 19:54:02
【问题描述】:

尝试执行 t-sql 存储过程时出现标题错误

EXEC Add500ToChecking 18568

我尝试删除 return 和 go 语句,但没有成功

USE [JProCo]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROC [dbo].[Add500ToChecking] @CustID INT AS

BEGIN TRAN

UPDATE SavAccount SET Balance = Balance - 500
WHERE CustomerID = @CustID
IF ( (SELECT Balance FROM SavAccount WHERE CustomerID = @CustID) < 0)
ROLLBACK TRAN
RETURN

UPDATE CkAccount SET Balance = Balance + 500
WHERE CustomerID = @CustID

COMMIT TRAN
RETURN
GO

知道我的代码发生了什么吗?这是一个班级项目

【问题讨论】:

  • 养成用 BEGIN 和 END 包围条件块的习惯。
  • 感谢您的建议,我会的。该代码逐字逐句来自类测试书(joes2pros),所以我花了一些时间在这里寻求帮助:)
  • 不是我第一次看到代码错误从技术编辑中溜走。除了 BEGIN/END 之外,我建议遵循缩进样式并使用分号语句终止符,这样可以使意图更清晰,代码更易于维护。

标签: sql-server tsql


【解决方案1】:

您的IF 声明需要一对BEGINEND

UPDATE SavAccount SET Balance = Balance - 500
WHERE CustomerID = @CustID
IF ( (SELECT Balance FROM SavAccount WHERE CustomerID = @CustID) < 0)
BEGIN
    ROLLBACK TRAN
    RETURN
END

正如所写,只有ROLLBACK TRANIF 语句的一部分,因此如果IF 检查失败,它不会回滚事务,而是立即执行RETURN

【讨论】:

  • 可能应该将“所以如果它没有通过 if 检查”改成“所以如果它不满足 if 条件”。在这个例子中,条件是寻找一个失败,以便它可以做某事,所以它的意思有点模棱两可。
猜你喜欢
  • 2015-06-23
  • 2016-06-21
  • 1970-01-01
  • 2012-02-18
  • 2015-12-21
  • 2021-05-23
  • 2014-03-22
  • 2014-10-25
  • 2016-07-21
相关资源
最近更新 更多