SQL Server 实用工具语句 - GO

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsMicrosoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库

SQL Server 提供不在 Transact-SQL 语句中、但 sqlcmd 和 osql 实用工具以及 SQL Server Management Studio 代码编辑器可识别的命令。 这些命令可用于提高批处理和脚本的可读性和执行效率。

GO 向 SQL Server 实用工具发出一批 Transact-SQL 语句已结束的信号。

Transact-SQL 语法约定

语法

GO [count]  

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

参数

计数
为一个正整数。 GO 之前的批处理将执行指定的次数。

备注

GO 不是 Transact-SQL 语句;它是可由 sqlcmd 和 osql 实用工具以及 SQL Server Management Studio 代码编辑器识别的命令。

SQL Server 实用工具将 GO 解释为应该向 SQL Server 实例发送当前批的 Transact-SQL 语句的信号。 当前批语句由上一 GO 命令后输入的所有语句组成,如果是第一条 GO 命令,则由即席会话或脚本开始后输入的所有语句组成。

GO 命令和 Transact-SQL 语句不能在同一行中。 但在 GO 命令行中可包含注释。

用户必须遵照使用批处理的规则。 例如,在批处理中的第一条语句后执行任何存储过程必须包含 EXECUTE 关键字。 局部(用户定义)变量的作用域限制在一个批处理中,不可在 GO 命令后引用。

USE AdventureWorks2022;  
GO  
DECLARE @MyMsg VARCHAR(50)  
SELECT @MyMsg = 'Hello, World.'  
GO -- @MyMsg is not valid after this GO ends the batch.  
  
-- Yields an error because @MyMsg not declared in this batch.  
PRINT @MyMsg  
GO  
  
SELECT @@VERSION;  
-- Yields an error: Must be EXEC sp_who if not first statement in   
-- batch.  
sp_who  
GO  

SQL Server 应用程序可以将多个 Transact-SQL 语句作为一个批发送到 SQL Server 的实例来执行。 然后,该批中的语句被编译成一个执行计划。 程序员在 SQL Server 实用工具中执行特殊语句,或生成 Transact-SQL 语句的脚本在 SQL Server 实用工具中运行时,使用 GO 作为批结束的信号。

如果基于 ODBC 或 OLE DB API 的应用程序试图执行 GO 命令,会收到语法错误。 SQL Server 实用工具从不向服务器发送 GO 命令。

不要将分号用作 GO 后的语句终止符。

-- Yields an error because ; is not permitted after GO  
SELECT @@VERSION;  
GO;  

在 Microsoft Fabric 门户 SQL 查询编辑器中,每个 SQL 语句都作为一个独立的会话运行。 SQL 语句中不会保留会话上下文。 有关详细信息,请参阅 SQL 查询编辑器

权限

GO 是一个不需任何权限的实用工具命令。 它可以由任何用户执行。

示例

以下示例创建两个批。 第一个批只包含一条 USE AdventureWorks2022 语句,用于设置数据库上下文。 其余的语句使用局部变量。 因此,所有局部变量声明必须组成一个批。 为此,必须在最后一条引用此变量的语句之后才使用 GO 命令。

USE AdventureWorks2022;  
GO  
DECLARE @NmbrPeople INT  
SELECT @NmbrPeople = COUNT(*)  
FROM Person.Person;  
PRINT 'The number of people as of ' +  
      CAST(GETDATE() AS CHAR(20)) + ' is ' +  
      CAST(@NmbrPeople AS CHAR(10));  
GO  

下面的示例执行了批处理中的语句两次。

SELECT DB_NAME();  
SELECT USER_NAME();  
GO 2