GO 不是 T-SQL 語句,而是 SQL Server 客戶端工具 (SSMS、sqlcmd、osql) 識別的批次分隔符。它告訴工具:「將上方所有語句作為一個批次送往伺服器執行」。
GO 分隔的語句群組為獨立批次。#temp) 不共享。SET XACT_ABORT ON 並涉及交易)。-- 無 GO:整個腳本中止,無任何結果 SELECT * FROM sysobjects WHERE id = 'a'; SELECT GETDATE();
-- 有 GO:第一批次報錯,第二批次仍輸出目前時間 SELECT * FROM sysobjects WHERE id = 'a'; GO SELECT GETDATE(); GO
結果:第二種寫法雖報錯,但仍能看到 GETDATE() 的結果集。
CREATE PROCEDURE、CREATE VIEW、SET SHOWPLAN_XML ON 等必須單獨佔一批次。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 獨佔一行,批次邊界清晰可見。