Sql server 错误“执行后的事务计数表示BEGIN和COMMIT语句的数量不匹配”

Sql server 错误“执行后的事务计数表示BEGIN和COMMIT语句的数量不匹配”,sql-server,tsql,Sql Server,Tsql,在尝试执行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 -

在尝试执行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
知道我的代码是怎么回事吗?这是一个类项目

您需要一对用于IF语句的开始和结束:

UPDATE SavAccount SET Balance = Balance - 500
WHERE CustomerID = @CustID
IF ( (SELECT Balance FROM SavAccount WHERE CustomerID = @CustID) < 0)
BEGIN
    ROLLBACK TRAN
    RETURN
END
如前所述,只有ROLLBACK TRAN是IF语句的一部分,因此,如果它未通过IF检查,它不会回滚事务,而是立即执行RETURN。

您的IF语句需要一对BEGIN和END:

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

如前所述,只有ROLLBACK TRAN是IF语句的一部分,因此如果它没有通过IF检查,它不会回滚事务,而是立即执行RETURN。

养成习惯,用BEGIN和END包围条件块。谢谢你的建议,我会的。这段代码是从类测试书joes2pros中逐字逐句提取的,所以我花了一些时间在这里寻求帮助:这不是我第一次看到代码错误从技术编辑中溜走。除了BEGIN/END之外,我建议遵循缩进样式并使用分号语句终止符,这样可以使意图更清晰,代码更易于维护。养成用BEGIN和END包围条件块的习惯。谢谢你的建议,我会的。这段代码是从类测试书joes2pros中逐字逐句提取的,所以我花了一些时间在这里寻求帮助:这不是我第一次看到代码错误从技术编辑中溜走。除了开始/结束之外,我建议遵循缩进样式并使用分号语句终止符,这样可以使意图更清晰,代码更易于维护。如果if检查失败,可能应该将so改为so,如果它不满足if条件。在本例中,条件正在查找故障,以便它可以执行某些操作,因此它的含义有点模糊。如果它未通过if检查,可能应该将so改为so,如果它不满足if条件。在这个例子中,条件是寻找一个失败,以便它可以做一些事情,所以它的意思有点模糊。