批次執行環境和 MARS

從 Microsoft SQL Server 2005 開始,可啟用連接來支援 Multiple Active Result Set (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

並假設具有預設執行環境的連接已啟用 MARS,其中 SET ARITHABORT 設為 OFF,SET ANSI_WARNINGS 設為 ON。

如果這兩個批次在該連接之下同時提交,它們會採用連接的預設批次環境設定,來開始執行。在執行期間,其環境會限定範圍,以確保一個批次的環境變更不會影響另一個批次的變更。當批次完成執行時,它會將所產生的環境複製回到連接的預設值。該連接產生的預設環境,視完成執行的最後批次而定。這將成為下一個執行批次所使用的環境。