0

我有一个存储过程,其中我没有使用任何明确的事务相关代码(即开始/回滚/提交事务),但@@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 ..

那么这里发生了什么?

4

1 回答 1

3

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

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

根据 MSDN:

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

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

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

于 2013-03-21T15:20:00.623 回答