批次

批次是指從應用程式同時傳送到 SQL Server 執行的一或多個 Transact-SQL 陳述式群組。SQL Server 將批次的陳述式編譯成單一可執行單元,稱為執行計畫。然後一次執行完畢該執行計畫中的陳述式。

Transact-SQL 陳述式應該使用分號終止。這不是強制性的需求,但是會取代不使用分號結束陳述式的功能,而且在未來版本的 Microsoft SQL Server 中可能會移除這個功能。

編譯錯誤 (例如語法錯誤) 會妨礙執行計畫的編譯。因此,不會執行批次中的任何陳述式。

執行階段錯誤 (像是算術溢位或條件約束違規) 會有下列其中一種影響:

  • 大部分的執行階段錯誤會停止目前的陳述式和批次中隨後進行的陳述式。

  • 某些執行階段錯誤 (像是強制違規) 只會停止目前的陳述式。批次中所有剩餘的陳述式都會執行。

在發生執行階段錯誤的陳述式之前執行的陳述式不受影響。唯一的例外是如果批次在交易中,而該錯誤造成交易回復。在這種情況下,執行階段錯誤回復之前所做的任何未認可的資料修改都會回復。

例如,假設某個批次中有 10 個陳述式。如果第五個陳述式有語法錯誤,批次中的所有陳述式都不會執行。如果此批次已經完成編譯,但在執行第二個陳述式時失敗,因為第一個陳述式已經執行,所以其結果不受影響。

SQL Server 提供陳述式層級重新編譯。也就是說,如果陳述式觸發重新編譯,則只有該陳述式會重新編譯,而非整個批次。此行為與 SQL Server 2000 不同。請看下列範例,它在相同批次中包含一個 CREATE TABLE 陳述式和四個 INSERT 陳述式。

CREATE TABLE dbo.t3(a int) ;
INSERT INTO dbo.t3 VALUES (1) ;
INSERT INTO dbo.t3 VALUES (1,1) ;
INSERT INTO dbo.t3 VALUES (3) ;
GO

SELECT * FROM dbo.t3 ;

首先,編譯批次。會編譯 CREATE TABLE 陳述式,但因為 dbo.t3 資料表尚未存在,所以不編譯 INSERT 陳述式。

然後,批次開始執行。建立資料表。編譯第一個 INSERT,並立即執行。現在資料表含有一個資料列。然後,編譯第二個 INSERT 陳述式。編譯失敗,終止批次。SELECT 陳述式傳回一資料列。

在 SQL Server 2000 中,批次開始執行,並建立資料表。三個 INSERT 陳述式逐一編譯,但未執行。因為第二個 INSERT 造成編譯錯誤,所以整個批次終止。SELECT 陳述式未傳回資料列。

使用批次的規則

下列規則適用於使用批次:

  • CREATE DEFAULT、CREATE FUNCTION、CREATE PROCEDURE、CREATE RULE、CREATE SCHEMA、CREATE TRIGGER 和 CREATE VIEW 陳述式在批次中不能與其他陳述式結合。CREATE 陳述式必須作為批次的開頭。該批次後面的所有其他陳述式將解譯為第一個 CREATE 陳述式的一部分定義。

  • 資料表不可變更,才能在同一批次中參考新資料行。

  • 如果 EXECUTE 陳述式是批次中的第一個陳述式,便不需要 EXECUTE 關鍵字。如果 EXECUTE 陳述式不是批次中第一個陳述式,就需要 EXECUTE 關鍵字。

重要事項重要事項

批次檔可能包含以純文字儲存的認證。在批次執行時,認證可能會反應到使用者畫面上。