4

我想設置SET XACT_ABORT ON與交易一個SQL Server 2008 R2的存儲過程,因此,無論是在創作劇本:如何在SQL Server事務中設置「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

您沒有在過程定義中包含'SET'語句。當你在2008年時,你應該看看'TRY ... CATCH'。 –

+0

@馬丁·史密斯:你的意思是不包括'SET XACT_ABORT ON'所有,而是由趕上'TRY..CATCH'錯誤,並明確'ROLLBACK'事務? – rem

+0

參見[這個答案](http://stackoverflow.com/questions/1150032/what-is-the-benefit-of-using-set-xact-abort-on-in-a-stored-procedure/1150350#1150350 )和下面的評論來討論這個問題。我絕對不會因爲你的代碼在TRY ... CATCH可用時測試SQL Server 2008上的'@@ ERROR'而煩惱。只要提到'XACT_ABORT'在'TRY'塊中有不同的效果。 –

回答

6

你通常設置xact_abort作爲存儲過程的身體的一部分:

CREATE PROCEDURE MyProc 
AS 
SET XACT_ABORT ON 
BEGIN TRAN 
.... 

但是也有一些從創建程序會話記住兩個「特殊」的設置。 Explanation from MSDN:

存儲過程執行與執行 時間除了SET ANSI_NULLS和SET QUOTED_IDENTIFIER指定的SET設置。存儲 程序指定SET ANSI_NULLS或SET QUOTED_IDENTIFIER使用在存儲過程創建時指定的 設置。如果在 存儲過程中使用,則會忽略任何SET設置。

因此,當您創建存儲過程時,SQL Server會將QUOTED_IDENTIFIER選項從連接複製到過程定義。目標是具有不同QUOTED_IDENTIFIER設置的其他人仍然獲得該過程的作者所期望的行爲。

同樣不是真正XACT_ABORT

+0

爲什麼你的sql示例使用'SET XACT_ABORT ON'並且還使用事務?是不是將'XACT_ABORT'設置爲'ON'以使整個過程成爲原子的目的?你爲什麼還需要交易? –

+0

好的,我看到作者已經在他的代碼示例中有過。不過,我以前的陳述是否準確? –

0

你沒有提到你是否正在使用SQL Management Studio中,但如果你是,點擊現有的存儲過程「修改」(這我假設是你做了什麼),那麼MS只是產生一個樣板腳本基於現有存儲過程的內容。

你可能會考慮定義在執行和修改的程序,以及其他任何你想要的存儲過程之外的選項(如SET XACT_ABORT ON)一個單獨的腳本文件的存儲過程。這樣你有更多的控制權,可以執行腳本來更新存儲過程。