Инструкции служебных программ SQL Server — GO
Область применения: SQL Server База данных SQL Azure Управляемый экземпляр 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]
Аргументы
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