如何在SQL Server事务中设置“SET XACT_ABORT ON”?

时间:2011-11-05 20:50:35

标签: sql-server sql-server-2008 tsql stored-procedures transactions

我想在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

2 个答案:

答案 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。