В чем разница между ; а GO в хранимой процедуре в SQL Server? - PullRequest
13 голосов
/ 22 февраля 2010

В чем разница между ; и GO в хранимой процедуре в SQL Server?

На самом деле, если у меня есть хранимая процедура на сервере SQL, и я хочу разместить внутри нее t отдельных запросов,первый просто вычисляет количество записей (количество), а второй выбирает несколько записей на основе некоторых условий, а что я должен использовать между этими двумя запросами?

Go или ;

Ответы [ 5 ]

21 голосов
/ 22 февраля 2010

; просто заканчивает утверждение.

GO - это не оператор, а команда для сервера для передачи текущего пакета в базу данных. Создает остановку внутри транзакции.

http://msdn.microsoft.com/en-us/library/ms188037.aspx

(Обновление, спасибо за комментарии):
Насколько я знаю, GO - это заявление, предназначенное для студии управления, возможно, и для других инструментов.

12 голосов
/ 22 февраля 2010

Точка с запятой разделяет запросы, команда GO разделяет пакеты. (Также GO - это не команда T-SQL, это команда, распознаваемая утилитами sqlcmd и osql и Management Studio.)

Вы не можете использовать GO внутри хранимой процедуры. Если вы попробуете, определение процедуры на этом закончится, а остальные будут отдельной партией.

Локальная переменная имеет область действия пакета, поэтому после команды GO нельзя использовать локальные переменные, объявленные перед командой GO:

declare @test int

set @test = 42

GO

select @Test -- causes an error message as @Test is undefined
4 голосов
/ 22 февраля 2010

GO - это не команда для сервера, это пакетный разделитель по умолчанию для большинства клиентских инструментов, поставляемых MS. Когда клиентский инструмент сам встречает «GO» на новой строке, он отправляет любые команды, накопленные им на данный момент, на сервер, а затем запускается заново.

Это означает, что любые переменные, объявленные в одном пакете, недоступны в последующих пакетах. И это также означает, что многострочные комментарии нельзя размещать вокруг команды «GO» - потому что сервер увидит первый пакет и увидит незавершенный комментарий.

2 голосов
/ 22 февраля 2010

Он отмечает конец пакета в Query Analyzer и поэтому сигнализирует об окончании определения хранимой процедуры в этом пакете. Столько, сколько я знаю, это не часть sp. GO не является командой TSQL.

А; просто заканчивает утверждение.

1 голос
/ 08 марта 2019

Я знаю, что эта ветка старая, но я подумал, что эти другие варианты использования / различия могут быть полезны для других поисков, таких как я, относительно GO.

  1. Все, что после GO не попадет в ваш sproc, потому что GO выполнит команду CREATE/ALTER PROCEDURE. Например, если вы запустите это ...

    СОЗДАТЬ ПРОЦЕДУРУ X КАК ВЫБЕРИТЕ 1 как X ИДТИ ВЫБЕРИТЕ 2 как X

Затем, запустив его, вы вернетесь, чтобы отредактировать процедуру, и обнаружите, что там находится только SELECT 1 As X, потому что GO создал звездочку и все, что после него предполагается следующим, что вы делаете, и не является частью sproc.

  1. Я удивлен, что я не видел там много упомянутого, но разделитель пакетов не только специфичен для программы, с которой вы запрашиваете, но в случае SSMS он фактически редактируемый пользователем! Если я зашел в настройки и изменил разделитель пакетов с GO на XX, то в моей копии SSMS XX выполняет пакет, а не GO. Так что же произойдет, если я попытаюсь выполнить хранимую процедуру, содержащую GO?

Думайте о GO как о способе сказать SSMS отправлять все, что находится выше, на сервер для выполнения. Сервер никогда не получает GO, поскольку он просто указывает на конец пакета команды, которую вы хотите, чтобы SSMS отправила на сервер. Если у вас есть сценарий, в котором вам нужно контролировать поток выполнения в вашей хранимой процедуре, вы можете использовать для этого BEGIN TRANSACTION и COMMIT TRANSACTION, и это разрешено в хранимых процедурах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...