Sql server SQL Server-执行存储过程后出错

Sql server SQL Server-执行存储过程后出错,sql-server,tsql,stored-procedures,transactions,Sql Server,Tsql,Stored Procedures,Transactions,执行存储过程时,为什么会收到以下错误消息 Msg 266,16级,状态2,程序spAddCustomer,第0行[批次开始第21行] EXECUTE后的事务计数表示BEGIN和COMMIT语句的数量不匹配。上一次计数=1,当前计数=2 需要帮忙吗,谢谢 存储过程代码: CREATE PROC spAddCustomer @FirstName VARCHAR = INPUT, @LastName VARCHAR = INPUT, @EmailAddress VARCHAR

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

Msg 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';
联合国对这一行发表评论:

ROLLBACK TRANSACTION --Any transaction work will be undone
联合国对这一行发表评论:

ROLLBACK TRANSACTION --Any transaction work will be undone

尝试在存储过程中将XACT_ABORT设置为ON。当SET XACT_ABORT处于启用状态且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;

尝试在存储过程中将XACT_ABORT设置为ON。当SET XACT_ABORT处于启用状态且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;

-您应该始终为所使用的任何
varchar
变量和参数提供长度。对于参数,如果省略显式长度,则会得到一个长度正好为一个字符的参数-这通常不是您想要的…..将
开始
添加到
之后作为
并将
结束
添加到存储过程的末尾。-您应该始终为所使用的任何
varchar
变量和参数提供长度。对于参数,如果省略显式长度,则会得到一个长度正好为一个字符的参数-这通常不是您想要的….在
之后添加
开始
,并在存储过程的末尾添加
结束
。我同意@ikram。看起来执行将进入CATCH块,但没有在那里执行任何操作。您也可以考虑在此处重新抛出异常或日志记录。如前所述,它将无声地回滚。我同意@ikram。看起来执行将进入CATCH块,但没有在那里执行任何操作。您也可以考虑在此处重新抛出异常或日志记录。如前所述,它将无声地回滚。