Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Команда GO  [new]
Чижанов Артем
Member

Откуда: г. Краснодар
Сообщений: 223
Прошу помочь разобраться с назначением команды GO.
В BOL по этому поводу прочитал

+
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 AdventureWorks, которая задает контекст базы данных. Остальные инструкции выполняют те или иные операции над локальной переменной и должны быть сгруппированы в один пакет. Поэтому следующая команда GO указывается только после последней инструкции, в которой используется переменная.
USE AdventureWorks;
GO
DECLARE @NmbrContacts int
SELECT @NmbrContacts = COUNT(*)
FROM Person.Contact
PRINT 'The number of contacts as of ' +
      CAST(GETDATE() AS char(20)) + ' is ' +
      CAST(@NmbrContacts AS char (10))
GO

После ознакомления с этой информацией не смог разобраться в чем будут различия, если выполнить приведенные в примере инструкции без команды GO.
USE AdventureWorks;
DECLARE @NmbrContacts int
SELECT @NmbrContacts = COUNT(*)
FROM Person.Contact
PRINT 'The number of contacts as of ' +
      CAST(GETDATE() AS char(20)) + ' is ' +
      CAST(@NmbrContacts AS char (10))
13 окт 09, 09:23    [7776355]     Ответить | Цитировать Сообщить модератору
 Re: Команда GO  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
При использовании команды GO нужно соблюдать требования, предъявляемые к пакетам. Например, при любом вызове хранимой процедуры после первой инструкции пакета нужно использовать ключевое слово EXECUTE. Область видимости локальных (пользовательских) переменных ограничена пакетом, и к ним нельзя обращаться после команды GO.

Попробуйте в своем примере не убирать GO, а наоборот, вставить после каждой инструкции.
13 окт 09, 09:28    [7776366]     Ответить | Цитировать Сообщить модератору
 Re: Команда GO  [new]
Ох...ий программизд
Guest
Чижанов Артем,

а попробуйте например вот так:
USE AdventureWorks;
GO
DECLARE @NmbrContacts int
SELECT @NmbrContacts = COUNT(*)
FROM Person.Contact
GO
PRINT 'The number of contacts as of ' +
      CAST(GETDATE() AS char(20)) + ' is ' +
      CAST(@NmbrContacts AS char (10))
GO

стало немного проясняться? :)
13 окт 09, 09:29    [7776372]     Ответить | Цитировать Сообщить модератору
 Re: Команда GO  [new]
Supra93
Member

Откуда:
Сообщений: 8174
CREATE TABLE TEMPDB..T1 (F1 INT)
--GO
CREATE TRIGGER TR1 ON TEMPDB..T1 FOR INSERT AS SELECT 1
--GO
DROP TABLE TEMPDB..T1
13 окт 09, 09:35    [7776387]     Ответить | Цитировать Сообщить модератору
 Re: Команда GO  [new]
Чижанов Артем
Member

Откуда: г. Краснодар
Сообщений: 223
Ох...ий программизд
Чижанов Артем,

а попробуйте например вот так:
USE AdventureWorks;
GO
DECLARE @NmbrContacts int
SELECT @NmbrContacts = COUNT(*)
FROM Person.Contact
GO
PRINT 'The number of contacts as of ' +
      CAST(GETDATE() AS char(20)) + ' is ' +
      CAST(@NmbrContacts AS char (10))
GO

стало немного проясняться? :)

Да, теперь стало более понятно.
Скажите, а если оператор GO вообще убрать из запроса, в чем тогда будет отличие от такого запроса
USE AdventureWorks;
GO
DECLARE @NmbrContacts int
SELECT @NmbrContacts = COUNT(*)
FROM Person.Contact
PRINT 'The number of contacts as of ' +
      CAST(GETDATE() AS char(20)) + ' is ' +
      CAST(@NmbrContacts AS char (10))
GO
13 окт 09, 15:52    [7779524]     Ответить | Цитировать Сообщить модератору
 Re: Команда GO  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Чижанов Артем
Скажите, а если оператор GO вообще убрать из запроса, в чем тогда будет отличие от такого запроса


В данном конкретном случае практически никакого. Просто все этой уйдет одим бачем.
13 окт 09, 15:55    [7779562]     Ответить | Цитировать Сообщить модератору
 Re: Команда GO  [new]
Glory
Member

Откуда:
Сообщений: 104760
Чижанов Артем

Да, теперь стало более понятно.
Скажите, а если оператор GO вообще убрать из запроса, в чем тогда будет отличие от такого запроса
USE AdventureWorks;
GO
DECLARE @NmbrContacts int
SELECT @NmbrContacts = COUNT(*)
FROM Person.Contact
PRINT 'The number of contacts as of ' +
      CAST(GETDATE() AS char(20)) + ' is ' +
      CAST(@NmbrContacts AS char (10))
GO

Да нет никакого оператора GO
Есть понятие пакета - т.е. группы команд, которые выполняются соместно, как единое целое
И есть понятие разделитель пакетов - некое ключевое слово, по котору некоторые приложение разделяют набранный вами скрипт. В том же SMS вы легко можете поменять разделитель пакетов на что угодно.
13 окт 09, 16:00    [7779600]     Ответить | Цитировать Сообщить модератору
 Re: Команда GO  [new]
Чижанов Артем
Member

Откуда: г. Краснодар
Сообщений: 223
Glory
Да нет никакого оператора GO
Есть понятие пакета - т.е. группы команд, которые выполняются соместно, как единое целое
И есть понятие разделитель пакетов - некое ключевое слово, по котору некоторые приложение разделяют набранный вами скрипт. В том же SMS вы легко можете поменять разделитель пакетов на что угодно.

Спасибо, теперь разобрался.
13 окт 09, 16:56    [7780162]     Ответить | Цитировать Сообщить модератору
 Re: Команда GO  [new]
nosov
Guest
не помню где в книге BOL написано что в некоторых случаях оператор GO обязателен
иначе последующий пакет начинает выполнятся до завершения предыдущего
и сeрвер выдает ошибку.

таким образом оператор GO дает возможность пакету отработать до конца
и последующий пакет ждет этого конца
13 окт 09, 17:05    [7780256]     Ответить | Цитировать Сообщить модератору
 Re: Команда GO  [new]
Glory
Member

Откуда:
Сообщений: 104760
nosov
не помню где в книге BOL написано что в некоторых случаях оператор GO обязателен
иначе последующий пакет начинает выполнятся до завершения предыдущего
и сeрвер выдает ошибку.

таким образом оператор GO дает возможность пакету отработать до конца
и последующий пакет ждет этого конца

Да не оператор дает эту возможность, а конкретная утилита. Которая читает получаемый скрипт частями от разделителя до разделителя. И каждую прочитанную часть отправляет серверу на выполнение
13 окт 09, 17:07    [7780286]     Ответить | Цитировать Сообщить модератору
 Re: Команда GO  [new]
nosov
Guest
Glory

Ваша правда !!!
хотел по простому на пальцах обЪяснить.
извняюсь за неточность.
13 окт 09, 17:19    [7780397]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить