2013-03-21 18 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...即时贴声明之后的第一项即可。

请注意,这不会清除现有的交易。如果您有存储过程之外的事务,它们仍然存在,此设置仅仅是为了防止创建任何新的隐含事务。

相关问题