我有一个存储过程,其中我没有使用任何显式的事务相关代码(即开始/回滚/提交事务),但@@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 ..
那么这里发生了什么?
答案 0 :(得分:3)
您无法在存储过程的主体之前获取SET IMPLICIT_TRANSACTIONS OFF
,因为这不是创建存储过程时捕获的值。当您将implicit_transactions设置为off时,您所做的只是设置连接的值,因此当您运行alter语句时,您将在关闭implicit_transactions的上下文中运行它,但与该设置无关以及为存储过程定义捕获的内容。
换句话说,有许多设置会在任何给定时间影响您的查询,但SQL Server仅在创建存储过程时捕获ANSI_NULLS
和QUOTED_IDENTIFIER
设置。
每个MSDN:
创建存储过程时,将捕获SET QUOTED_IDENTIFIER和SET ANSI_NULLS设置,并将其用于后续调用该存储过程。
如果您希望sproc的内容受SET IMPLICIT_TRANSACTIONS OFF
设置的影响,只需将其设置为Create Proc Name (variables Datatypes) As...
sproc声明后的第一个内容。
请注意,这不会清除现有交易。如果您在存储过程之外的事务仍然存在,则此设置只是为了防止创建任何新的隐含事务。