存储过程无法将IMPLICIT_TRANSACTIONS设置为OFF?

时间:2013-03-21 14:48:08

标签: sql sql-server stored-procedures transactions

我有一个存储过程,其中我没有使用任何显式的事务相关代码(即开始/回滚/提交事务),但@@Trancount设置为2(我正在监控这是通过在存储过程期间将此值写入表的行条目)。这显然意味着IMPLICIT_TRANSACTIONS在某处设置为ON

我将以下几行添加到我的存储过程的开头....

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 ..

那么这里发生了什么?

1 个答案:

答案 0 :(得分:3)

您无法在存储过程的主体之前获取SET IMPLICIT_TRANSACTIONS OFF,因为这不是创建存储过程时捕获的值。当您将implicit_transactions设置为off时,您所做的只是设置连接的值,因此当您运行alter语句时,您将在关闭implicit_transactions的上下文中运行它,但与该设置无关以及为存储过程定义捕获的内容。

换句话说,有许多设置会在任何给定时间影响您的查询,但SQL Server仅在创建存储过程时捕获ANSI_NULLSQUOTED_IDENTIFIER设置。

每个MSDN:

创建存储过程时,将捕获SET QUOTED_IDENTIFIER和SET ANSI_NULLS设置,并将其用于后续调用该存储过程。

如果您希望sproc的内容受SET IMPLICIT_TRANSACTIONS OFF设置的影响,只需将其设置为Create Proc Name (variables Datatypes) As... sproc声明后的第一个内容。

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