首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 批次處理 (Batch) 核心知識點:GO、錯誤處理、必須獨立批次的陳述式與 EXEC 陷阱

     編輯:關於SqlServer

什麼是批次?

批次 是一組作為單一單位送往 SQL Server 執行的 T-SQL 陳述式集合。以 GO 為分隔符(非 T-SQL 命令,為 SSMS/sqlcmd 工具識別符)。

GO 使用規則

  1. 獨佔一行,前後不可有其他字元。
  2. 每個批次**獨立編譯、獨立執行計畫、獨立送往伺服器**;批次間無變數共享、無暫存表共享(除非全域暫存表 ##)。
  3. 批次間**可能平行執行**(視伺服器負載),**不保證順序**;若有相依性,請放在同一批次或用 WAITFOR 同步。

批次中的錯誤類型

類型偵測時機範例影響範圍
語法錯誤編譯階段 (執行前)SELCT * FROM t;整個批次**完全不執行**
執行階段錯誤執行中PK 衝突、除零、截斷、死結預設**終止該陳述式**,後續陳述式**繼續執行** (除非 SET XACT_ABORT ON 或 TRY/CATCH)

必須獨佔一個批次的陳述式

以下陳述式**不能**與其他陳述式在同一批次 (需前後加 GO):

  • CREATE DEFAULT
  • CREATE PROCEDURE
  • CREATE RULE
  • CREATE TRIGGER
  • CREATE VIEW
  • CREATE FUNCTION
  • CREATE SCHEMA
原因:這些陳述式包含完整的模組定義,編譯器需一次解析完整主體;混在其他陳述式中會導致解析錯誤。

EXEC 執行動態 SQL 的五大陷阱

陷阱說明對策
作用域隔離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。函數需動態邏輯時,改寫為預存程序或應用層處理。

最佳實踐建議

  1. 腳本檔案:每個物件建立腳本獨立檔案,部署工具自動處理批次分隔。
  2. 錯誤處理:重要腳本開頭加 SET XACT_ABORT ON; SET NOCOUNT ON;,關鍵區塊包 TRY/CATCH。
  3. 動態 SQL:永遠使用 sp_executesql 參數化,禁用 EXEC (@SQL) 字串拼接。
  4. 變數生命週期:記住批次隔離變數,跨批次需用暫存表 / 表變數 / 永久表傳遞。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved