批次 是一組作為單一單位送往 SQL Server 執行的 T-SQL 陳述式集合。以 GO 為分隔符(非 T-SQL 命令,為 SSMS/sqlcmd 工具識別符)。
WAITFOR 同步。| 類型 | 偵測時機 | 範例 | 影響範圍 |
|---|---|---|---|
| 語法錯誤 | 編譯階段 (執行前) | SELCT * FROM t; | 整個批次**完全不執行** |
| 執行階段錯誤 | 執行中 | PK 衝突、除零、截斷、死結 | 預設**終止該陳述式**,後續陳述式**繼續執行** (除非 SET XACT_ABORT ON 或 TRY/CATCH) |
以下陳述式**不能**與其他陳述式在同一批次 (需前後加 GO):
CREATE DEFAULTCREATE PROCEDURECREATE RULECREATE TRIGGERCREATE VIEWCREATE FUNCTIONCREATE SCHEMA原因:這些陳述式包含完整的模組定義,編譯器需一次解析完整主體;混在其他陳述式中會導致解析錯誤。
| 陷阱 | 說明 | 對策 |
|---|---|---|
| 作用域隔離 | EXEC 與呼叫端在**不同作用域**;呼叫端變數不可在動態 SQL 直接引用,動態 SQL 變數也不外洩。 | 用 sp_executesql 參數化傳遞輸入/輸出值。 |
| 安全性內容 | 預設在**目前使用者**安全內容執行,而非模組擁有者 (EXECUTE AS 除外)。 | 需跨權限存取時加 WITH EXECUTE AS OWNER/SELF/'user'。 |
| 連線與交易共享 | EXEC 與呼叫端**共用同一連線、同一交易**;動態 SQL 中的 COMMIT/ROLLBACK 影響外層。 | 謹慎控制交易邊界;動態 SQL 避免自行管理交易。 |
| 字串串聯順序 | 動態 SQL 字串構建 (含函數呼叫) **必須在 EXEC 陳述式之前**完成;不能在同一陳述式中串聯並執行。 | 先 SET @SQL = ... 再 EXEC sp_executesql @SQL。 |
| 函數內禁用 | 使用者定義函數 (UDF) 內不可使用 EXEC / sp_executesql。 | 函數需動態邏輯時,改寫為預存程序或應用層處理。 |
SET XACT_ABORT ON; SET NOCOUNT ON;,關鍵區塊包 TRY/CATCH。sp_executesql 參數化,禁用 EXEC (@SQL) 字串拼接。