2013-03-21 95 views
0

我有一個存儲過程,我沒有使用任何明確的交易相關的代碼(即開始/回滾/提交交易),但@@Trancount設置爲2(我通過將此值寫入表的行在存儲過程中輸入)。這顯然意味着IMPLICIT_TRANSACTIONS設置爲ON某處。無法爲存儲過程將IMPLICIT_TRANSACTIONS設置爲OFF?

我加入以下行到我的存儲過程的開始....

SET IMPLICIT_TRANSACTIONS OFF 
GO 

....使之成爲這樣的:當我執行

USE [RentTrackingSystem] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
SET IMPLICIT_TRANSACTIONS OFF 
GO 
ALTER PROCEDURE [RTS].[GenerateAnnualPenalty] 
    -- Add the parameters for the stored procedure here 

    @dueDate Date = NULL , 
    @fiscalYear numeric(4), 
    @createdBy Varchar(50), 
    @referenceForm Varchar(50), 
    @referenceFormNo Varchar(50), 
    @PENALTY_NO int , 
    @PenaltyCutOffDate date = NULL 

AS 

-- Rest of the body here .. 

然而該查詢(更改存儲過程),關閉該窗口,然後再次打開相同的存儲過程的代碼,該添加消失,並且存儲過程再次變爲:

USE [RentTrackingSystem] 
GO 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [RTS].[GenerateAnnualPenalty] 
    -- Add the parameters for the stored procedure here 

    @dueDate Date = NULL , 
    @fiscalYear numeric(4), 
    @createdBy Varchar(50), 
    @referenceForm Varchar(50), 
    @referenceFormNo Varchar(50), 
    @PENALTY_NO int , 
    @PenaltyCutOffDate date = NULL 

AS 

-- Rest of the body here .. 

那麼這裏發生了什麼?

+0

我懷疑你在那裏有太多的GO語句。這發生在我身上。你檢查過了嗎? – Melanie 2013-03-21 14:52:45

+0

我不明白。我可以使用多少個GO語句是否有限制?另外,你是否指AS語句後有太多的GO語句? – Ahmad 2013-03-21 15:02:01

+0

沒有絕對的限制,但在您的存儲過程的不適當位置可能會有GO語句。你能發佈sp的全部文本嗎? – Melanie 2013-03-21 15:11:24

回答

3

在存儲過程的主體之前無法獲得SET IMPLICIT_TRANSACTIONS OFF,因爲這不是在創建存儲過程時捕獲的值。當您將implicit_transactions設置爲off時,您所做的全部工作就是設置連接的值,因此當您運行alter語句時,您將在隱式implicit_transactions關閉的情況下運行它,但與該設置無關以及爲存儲過程定義捕獲的內容。

換句話說,在任何給定時間有很多設置會影響您的查詢,但SQL Server僅在創建存儲過程時捕獲ANSI_NULLSQUOTED_IDENTIFIER設置。

每MSDN:

當創建一個存儲過程中,SET QUOTED_IDENTIFIER和SET ANSI_NULLS設置被捕獲並用於該存儲過程的後續調用。

如果您希望影片的內容受到SET IMPLICIT_TRANSACTIONS OFF設置的影響,只需將它設置爲Create Proc Name (variables Datatypes) As...即時貼聲明之後的第一項即可。

請注意,這不會清除現有的交易。如果您有存儲過程之外的事務,它們仍然存在,此設置僅僅是爲了防止創建任何新的隱含事務。

相關問題