Instrucciones de utilidades de SQL Server: GO

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsPunto de conexión de análisis SQL en Microsoft FabricAlmacenamiento en Microsoft Fabric

SQL Server proporciona comandos que no son instrucciones de Transact-SQL, pero que las utilidades sqlcmd y osql, y el Editor de código de SQL Server Management Studio sí reconocen. Estos comandos se pueden usar para facilitar la legibilidad y la ejecución de lotes y scripts.

GO indica a las utilidades de SQL Server el final de un lote de instrucciones Transact-SQL.

Convenciones de sintaxis de Transact-SQL

Sintaxis

GO [count]  

Nota:

Para ver la sintaxis de Transact-SQL para SQL Server 2014 (12.x) y versiones anteriores, consulte Versiones anteriores de la documentación.

Argumentos

count
Es un entero positivo. El lote que precede a GO se ejecutará el número especificado de veces.

Observaciones

GO no es una instrucción Transact-SQL, sino un comando reconocido por las utilidades sqlcmd y osql, así como por el Editor de código de SQL Server Management Studio.

Las utilidades de SQL Server interpretan GO como una señal de que deben enviar el lote actual de instrucciones Transact-SQL a una instancia de SQL Server. El lote actual de instrucciones está formado por todas las instrucciones especificadas desde el último comando GO o desde el comienzo de la sesión o script ad hoc si se trata del primer comando GO.

Una instrucción Transact-SQL no puede ocupar la misma línea que un comando GO. Sin embargo, la línea sí puede contener comentarios.

Los usuarios deben seguir las reglas de los lotes. Por ejemplo, la ejecución de un procedimiento almacenado después de la primera instrucción de un lote debe incluir la palabra clave EXECUTE. El ámbito de las variables locales (definidas por el usuario) está limitado a un lote y no es posible referirse a ellas después del comando 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  

Las aplicaciones de SQL Server pueden enviar varias instrucciones Transact-SQL a una instancia de SQL Server para su ejecución como un lote. En ese momento, las instrucciones del lote se compilan en un único plan de ejecución. Los programadores que ejecutan instrucciones ad hoc en las utilidades de SQL Server o que generan Scripts de instrucciones Transact-SQL para ejecutarlas a través de las utilidades de SQL Server utilizan el comando GO para indicar el final de un lote.

Las aplicaciones basadas en las API de ODBC u OLE DB reciben un error de sintaxis al intentar ejecutar un comando GO. Las utilidades de SQL Server nunca envían un comando GO al servidor.

No use un punto y coma como terminador de instrucción después de GO.

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

En el editor de consultas SQL del portal de Microsoft Fabric, cada instrucción SQL se ejecuta como una sesión independiente. El contexto de sesión no persiste en las instrucciones SQL. Para más información, consulte Editor de consultas SQL.

Permisos

GO es un comando de utilidad que no requiere permisos. Cualquier usuario puede ejecutarlo.

Ejemplos

En el siguiente ejemplo se crean dos lotes. El primer lote solo contiene una instrucción USE AdventureWorks2022 para establecer el contexto de base de datos. Las instrucciones restantes utilizan una variable local. Por lo tanto, es necesario agrupar todas las declaraciones de variable locales en un único lote. Esto se logra al no usar el comando GO hasta después de la última instrucción que hace referencia a la variable.

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  

En el siguiente ejemplo ejecutan las instrucciones del lote dos veces.

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