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

SQL Server GO 指令深度解析:批次分隔符與錯誤隔離機制

     編輯:關於SqlServer

GO 是什麼?

GO 不是 T-SQL 語句,而是 SQL Server 客戶端工具 (SSMS、sqlcmd、osql) 識別的批次分隔符。它告訴工具:「將上方所有語句作為一個批次送往伺服器執行」。

核心特性

  • 批次邊界:每個 GO 分隔的語句群組為獨立批次。
  • 變數作用域:批次間區域變數、臨時表 (#temp) 不共享。
  • 錯誤隔離:單批次語法/執行錯誤不會中止後續批次執行(除非啟用 SET XACT_ABORT ON 並涉及交易)。
  • 編譯單位:批次是編譯、執行計劃快取的基本單位。

實戰對比:有無 GO 的差異

場景:第一條語句報錯,第二條正常

-- 無 GO:整個腳本中止,無任何結果
SELECT * FROM sysobjects WHERE id = 'a';
SELECT GETDATE();
-- 有 GO:第一批次報錯,第二批次仍輸出目前時間
SELECT * FROM sysobjects WHERE id = 'a';
GO
SELECT GETDATE();
GO

結果:第二種寫法雖報錯,但仍能看到 GETDATE() 的結果集。

常見使用時機

  1. 超長腳本分批:避免單批次過大導致記憶體壓力或編譯超時。
  2. 特定語句必須為批次首句:CREATE PROCEDURE、CREATE VIEW、SET SHOWPLAN_XML ON 等必須單獨佔一批次。
  3. 變數重用:同名區域變數在不同批次可重複宣告。
  4. 交易控制:搭配 BEGIN TRAN/COMMIT 實現批次級交易邊界。

完整範例:建立資料庫與表結構

USE master;
GO

IF EXISTS (SELECT * FROM sys.databases WHERE name = 'kejianDB')
    DROP DATABASE kejianDB;
GO

CREATE DATABASE kejianDB;
GO

USE kejianDB;
GO

CREATE TABLE Trade (
    tra_Id INT PRIMARY KEY IDENTITY(1,1) NOT NULL,
    tra_Name VARCHAR(50) NOT NULL
);
GO

常見誤區與最佳實踐

誤區正確認知
GO 是 T-SQL 關鍵字僅為客戶端工具指令,伺服器端不解析
GO 後可直接接註解建議 GO 獨佔一行,避免解析歧義
批次間自動提交交易僅當批次內無顯式交易時,隱式交易自動提交
所有工具都支援 GO僅 SSMS、sqlcmd、osql、Azure Data Studio 等官方工具支援

總結

善用 GO 可將龐大腳本模組化、錯誤隔離、變數隔離,是編寫可維護、可重試 SQL 腳本的關鍵習慣。記住:GO 獨佔一行,批次邊界清晰可見。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved