При работе с SQL Server важно понимать правильное использование команды GO и разделителя точка с запятой. Эти требования к синтаксису были введены в SQL Server 2005 и иногда могут быть запутывающими для программистов T-SQL, привыкших к более ранним версиям SQL Server.
Команда GO
Команда GO является разделителем пакета, используемым в SQL Server. Она фактически не является частью языка Transact-SQL, а является командой, используемой утилитами, такими как SQLCMD, OSQL и ISQL. Ее также можно использовать в Query Analyzer и окне редактора запросов. Важно отметить, что пакет не следует путать со скриптом. Пакет – это набор T-SQL операторов, отправляемых на выполнение как группа, в то время как скрипт – это просто файл, содержащий набор T-SQL операторов, который может содержать несколько пакетов.
Разделитель точка с запятой
Символ точка с запятой (;) является разделителем оператора, который является частью стандарта ANSI SQL-92. Однако он никогда не использовался в Transact-SQL до SQL Server 2005. В более ранних версиях SQL Server была возможность написать код T-SQL без использования точки с запятой.
Использование точки с запятой
Существуют две ситуации, в которых необходимо использовать точку с запятой. Первая – при использовании общего выражения таблицы (CTE), которое не является первым оператором в пакете. Вторая – при выполнении оператора службы Broker, который не является первым оператором в пакете. Вот пример команды службы Broker:
USE SQLExamples DECLARE @ConversationHandle uniqueidentifier; BEGIN TRANSACTION; BEGIN DIALOG CONVERSATION @ConversationHandle FROM SERVICE [ResponseService] TO SERVICE 'RequestService' ON CONTRACT [Contract] WITH LIFETIME = 600, ENCRYPTION = ON ; -- Здесь требуется разделитель точка с запятой SEND ON CONVERSATION @ConversationHandle MESSAGE TYPE [GetRecord] (<123456789>); COMMIT;
В этом примере точка с запятой необходима, чтобы убедиться, что следующая команда SEND является первым словом в команде. Использование команды GO в этой ситуации приведет к уничтожению переменной, используемой для передачи значения оператору.
Также стоит отметить, что есть ситуации, в которых требуется использование команды GO. Например, при создании хранимой процедуры команда GO используется для разделения разных пакетов операторов:
SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO CREATE PROCEDURE dbo.uspTestProc1 AS BEGIN SELECT * FROM INFORMATION_SCHEMA.TABLES END
Если бы в этом скрипте вместо команд GO использовались точки с запятой, попытка создать хранимую процедуру завершилась бы неудачей.
Выбор между GO и точкой с запятой
Иногда может быть неясно, следует ли использовать команду GO или разделитель точка с запятой в скрипте. Рассмотрим следующий пример:
/* Пример 1: Использование точек с запятой */ USE AdventureWorks; DECLARE @StartProductID int; DECLARE @CheckDate datetime; SELECT @StartProductID = 972; SELECT @CheckDate = '2004-04-04'; EXEC dbo.uspGetBillOfMaterials @StartProductID, @CheckDate; -- Переключение на другую базу данных USE model; -- Переключение обратно на AdventureWorks USE AdventureWorks; -- Изменение значений переменных SELECT @StartProductID = 400; SELECT @CheckDate = '2000-08-08'; EXEC dbo.uspGetBillOfMaterials @StartProductID, @CheckDate;
В этом примере точки с запятой позволяют выполнять одни и те же команды с разными значениями параметров, даже при переключении между разными базами данных в рамках одного пакета.
/* Пример 2: Использование команды GO */ USE AdventureWorks; GO DECLARE @StartProductID int; DECLARE @CheckDate datetime; SELECT @StartProductID = 972; SELECT @CheckDate = '2004-04-04'; EXEC dbo.uspGetBillOfMaterials @StartProductID, @CheckDate; GO -- Переключение на другую базу данных USE model; GO -- Переключение обратно на AdventureWorks USE AdventureWorks; GO -- Попытка изменить значения переменных SELECT @StartProductID = 400; SELECT @CheckDate = '2000-08-08'; EXEC dbo.uspGetBillOfMaterials @StartProductID, @CheckDate;
В этом случае использование команды GO завершает пакет, что приводит к уничтожению переменных. В результате попытка присвоить новые значения этим переменным завершается неудачей.
Заключение
Понимание правильного использования команды GO и разделителя точка с запятой является важным для написания правильного и эффективного кода T-SQL в SQL Server. Следуя рекомендациям, изложенным в этой статье, вы можете быть уверены, что ваши скрипты и пакеты выполняются так, как задумано. Если у вас возникнут дополнительные вопросы или вам потребуется дополнительная информация, не стесняйтесь обращаться.