Я знаю, что эта ветка старая, но я подумал, что эти другие варианты использования / различия могут быть полезны для других поисков, таких как я, относительно GO
.
Все, что после GO
не попадет в ваш sproc, потому что GO
выполнит команду CREATE/ALTER PROCEDURE
. Например, если вы запустите это ...
СОЗДАТЬ ПРОЦЕДУРУ X КАК
ВЫБЕРИТЕ 1 как X
ИДТИ
ВЫБЕРИТЕ 2 как X
Затем, запустив его, вы вернетесь, чтобы отредактировать процедуру, и обнаружите, что там находится только SELECT 1 As X
, потому что GO
создал звездочку и все, что после него предполагается следующим, что вы делаете, и не является частью sproc.
- Я удивлен, что я не видел там много упомянутого, но разделитель пакетов не только специфичен для программы, с которой вы запрашиваете, но в случае SSMS он фактически редактируемый пользователем! Если я зашел в настройки и изменил разделитель пакетов с GO на XX, то в моей копии SSMS XX выполняет пакет, а не GO. Так что же произойдет, если я попытаюсь выполнить хранимую процедуру, содержащую GO?
Думайте о GO
как о способе сказать SSMS отправлять все, что находится выше, на сервер для выполнения. Сервер никогда не получает GO
, поскольку он просто указывает на конец пакета команды, которую вы хотите, чтобы SSMS отправила на сервер.
Если у вас есть сценарий, в котором вам нужно контролировать поток выполнения в вашей хранимой процедуре, вы можете использовать для этого BEGIN TRANSACTION
и COMMIT TRANSACTION
, и это разрешено в хранимых процедурах.