我想在SQL Server 2008R2存储过程中使用事务设置SET XACT_ABORT ON
,所以在创建脚本中执行此操作:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET XACT_ABORT ON
GO
CREATE PROCEDURE MyProc
AS
BEGIN TRAN
...
IF @@ERROR <> 0
BEGIN
GOTO Done
END
...
IF @@ERROR <> 0
BEGIN
GOTO Done
END
COMMIT TRAN
Done:
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
END
GO
成功创建后,我通过单击“修改”存储过程选项检查事务,并在生成的ALTER PROCEDURE
脚本中看不到SET XACT_ABORT ON
行:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE MyProc
AS
BEGIN TRAN
...
我错在哪里或者诀窍是什么?如何正确定义SET XACT_ABORT ON
?
答案 0 :(得分:6)
您通常将xact_abort
设置为存储过程正文的一部分:
CREATE PROCEDURE MyProc
AS
SET XACT_ABORT ON
BEGIN TRAN
....
从创建过程的会话中记住有两个“特殊”设置。 Explanation from MSDN:
存储过程使用execute中指定的SET设置执行 除了SET ANSI_NULLS和SET QUOTED_IDENTIFIER之外的时间。存储 指定SET ANSI_NULLS或SET QUOTED_IDENTIFIER的过程使用 在存储过程创建时指定的设置。如果在里面使用 存储过程,任何SET设置都将被忽略。
因此,当您创建存储过程时,SQL Server会将QUOTED_IDENTIFIER选项从连接复制到过程定义。目标是具有不同QUOTED_IDENTIFIER设置的其他人仍然获得该过程的作者所期望的行为。
XACT_ABORT
也是如此。
答案 1 :(得分:0)
您没有提到您是否使用SQL Management Studio,但是如果您是,并且在现有存储过程上单击“修改”(我假设您就是这样做),那么MS只会生成样板脚本基于现有存储过程的内容。
您可以考虑在执行和更改程序的单独脚本文件中定义存储过程,以及在sproc之外需要的任何其他选项(例如SET XACT_ABORT ON)。这样你就可以获得更多控制权并且可以执行脚本来更新sproc。