【问题标题】:SQL Server - error after executing stored procedureSQL Server - 执行存储过程后出错
【发布时间】:2019-04-20 02:16:30
【问题描述】:

执行存储过程时,为什么会收到以下错误消息?

消息 266,级别 16,状态 2,过程 spAddCustomer,第 0 行 [批处理开始第 21 行]
EXECUTE 之后的事务计数表明 BEGIN 和 COMMIT 语句的数量不匹配。先前计数 = 1,当前计数 = 2。

任何帮助,谢谢。

存储过程代码:

CREATE PROC spAddCustomer
    @FirstName VARCHAR = INPUT,
    @LastName VARCHAR = INPUT,
    @EmailAddress VARCHAR = INPUT,
    @PhoneNumber VARCHAR = INPUT
AS
BEGIN TRY
BEGIN TRANSACTION 
    INSERT INTO sales.CustomerPII (FirstName, LastName, EmailAddress, PhoneNumber)
    VALUES (@FirstName, @LastName, @EmailAddress, @PhoneNumber);

    COMMIT TRANSACTION
END TRY
BEGIN CATCH
--Rows inserted still exist
--SELECT ERROR_NUMBER()
    --ROLLBACK TRANSACTION --Any transaction work will be undone
END CATCH;

执行

EXEC spAddCustomer 'FirstTest', 'LastTest', 'EmailTest', 'AddressTest';

【问题讨论】:

  • Bad habits to kick : declaring VARCHAR without (length) - 您应该始终为您使用的任何varchar 变量和参数提供一个长度。对于参数,如果您省略显式长度,您将获得长度为恰好一个字符的参数 - 这通常不是您想要的.....
  • AS 之后添加BEGIN 并在存储过程的末尾添加END

标签: sql-server tsql stored-procedures transactions


【解决方案1】:

取消注释此行:

ROLLBACK TRANSACTION --Any transaction work will be undone

【讨论】:

  • 我同意@ikram。似乎执行正在进入 CATCH 块,但那里没有采取任何行动。您也可以考虑在此处重新抛出异常,或记录。如所写,它将静默回滚。
【解决方案2】:

尝试在存储过程中设置 XACT_ABORT ON。当 SET XACT_ABORT 为 ON 且 T-SQL 语句引发运行时错误时,SQL Server 会自动回滚当前事务。尝试如下:

USE AdventureWorks2016CTP3
GO
CREATE PROC spAddCustomer
@FirstName varchar = INPUT,
@LastName varchar = INPUT,
@EmailAddress varchar = INPUT,
@PhoneNumber varchar = INPUT
AS

SET NOCOUNT ON 
SET XACT_ABORT ON
BEGIN TRY
BEGIN TRANSACTION 
INSERT INTO sales.CustomerPII (FirstName,LastName,EmailAddress,PhoneNumber)
VALUES(@FirstName, @LastName, @EmailAddress, @PhoneNumber);
COMMIT TRANSACTION
END TRY
BEGIN CATCH

END CATCH;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    • 2021-05-22
    • 2016-10-15
    相关资源
    最近更新 更多