批处理执行环境和 MARS

从 Microsoft SQL Server 2005 开始,可以启用连接以支持多个活动的结果集 (MARS)。这些连接与默认的批处理执行环境相关联。

批处理执行环境由下列组件构成:

  • SET 选项值(包括 ANSI_NULLS、DATE_FORMAT、LANGUAGE 和 TEXTSIZE)

  • 安全上下文(批处理执行环境的用户或应用程序角色)

  • 数据库上下文(环境的当前数据库)

  • 执行状态函数(包括 @@ERROR、@@ROWCOUNT、@@FETCH_STATUS 和 @@IDENTITY)

  • 顶级临时表

为特定连接开始执行的每个新批处理接收默认环境的一个副本。无论何时执行批处理,对执行环境所做的所有更改都只限于该特定的批处理。执行完成后,执行设置将复制到默认环境中。如果一个批处理发出多个要按顺序执行的命令,观察到的行为将与 SQL Server 早期版本中涉及客户端和服务器的连接所表现出来的行为相同。

在 SQL Server 的早期版本中,任何给定时间只能执行一个批处理。因此,由批处理对批处理环境所做的更改对所有后续批处理都可见。

对于存储过程和函数,批处理的默认环境也是连接的默认环境,但当执行完成后,更改不会复制回连接的默认批处理执行环境。

例如,假设两个批处理按照如下方式执行:

--First Batch
SET ARITHABORT ON
SET ANSI_WARNINGS ON
SELECT 1/0
GO
--Second Batch
SET ARITHABORT OFF
SET ANSI_WARNINGS OFF
SELECT 1/0
GO

还假设为具有默认执行环境、SET ARITHABORT 设置为 OFF,且 ANSI_WARNINGS 设置为 ON 的连接启用 MARS。

如果两个批处理在连接下并发提交,它们将使用连接的默认批处理环境设置开始执行。在执行过程中,它们的环境将受到限制,以确保一个批处理中的环境更改不会影响另一个批处理中的更改。当批处理执行完成后,它将得到的环境复制回连接的默认环境。连接得到的默认环境取决于最后完成执行的一个批处理。它将成为执行的下一个批处理使用的环境。