Sql server SQL Server-执行存储过程后出错
执行存储过程时,为什么会收到以下错误消息 Msg 266,16级,状态2,程序spAddCustomer,第0行[批次开始第21行]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
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块,但没有在那里执行任何操作。您也可以考虑在此处重新抛出异常或日志记录。如前所述,它将无声地回滚。