Инструкции служебных программ SQL Server — GO

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure Конечная точка аналитики Synapse Analyticsв Хранилище Microsoft Fabric в Microsoft Fabric

В SQL Server предоставляются команды, которые не являются инструкциями Transact-SQL, но распознаются программами sqlcmd и osql, а также редактором кода в среде SQL Server Management Studio. Эти команды используются для повышения удобочитаемости и упрощения выполнения пакетов и скриптов.

GO информирует программы SQL Server об окончании пакета инструкций Transact-SQL.

Соглашения о синтаксисе Transact-SQL

Синтаксис

GO [count]  

Примечание.

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

count
Целое положительное число. Пакет, предшествующий команде GO, будет выполняться заданное количество раз.

Замечания

GO — это не инструкция Transact-SQL; это команда, распознаваемая программами sqlcmd и osql, а также редактором кода среды SQL Server Management Studio.

Программы SQL Server интерпретируют команду GO как сигнал о том, что им следует отправить текущий пакет инструкций Transact-SQL экземпляру SQL Server. Текущий пакет инструкций состоит из всех инструкций, введенных за время, прошедшее с момента обработки последней команды GO, или, если данная команда GO является первой, с момента начала нерегламентированного сеанса или скрипта.

Инструкция Transact-SQL не может располагаться на той же строке, что и команда GO. Тем не менее строка с командой GO может содержать комментарии.

При использовании команды 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 как сигнал об окончании пакета.

Приложения, основанные на API-интерфейсах ODBC или OLE DB, при попытке выполнить команду GO получают уведомление о синтаксической ошибке. Служебные программы SQL Server никогда не отправляют команду GO на сервер.

Не используйте точку с запятой в качестве признака конца инструкции после команды GO.

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

В редакторе запросов SQL на портале Microsoft Fabric каждая инструкция 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