Published on

September 17, 2007

Понимание команды GO и разделителя точка с запятой в SQL Server

При работе с 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. Следуя рекомендациям, изложенным в этой статье, вы можете быть уверены, что ваши скрипты и пакеты выполняются так, как задумано. Если у вас возникнут дополнительные вопросы или вам потребуется дополнительная информация, не стесняйтесь обращаться.

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.