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

Откуда:
Сообщений: 13
Люди, объясните, зачем нужен оператор GO, а то нигде не написано, я им не пользуюсь, и жить это не мешает...
4 авг 01, 02:46    [11469]     Ответить | Цитировать Сообщить модератору
 RE:оператор GO  [new]
Александр Гладченко
Member

Откуда:
Сообщений: 10765
Блог
Batch - это набор операторов TSQL, передаваемых на выпонение и выполняющихся вместе, как одно целое. Batch компилируется целиком и оканчивается специальным символом-сигналом конца (go). Все последовательности операторов TSQL, набираемые в ISQL/w или в Enterprise Manager интерпретируются именно как batch'и (интересно то, что при выделении некоторой части текста в окне выполняться будет именно она).
4 авг 01, 09:35    [11470]     Ответить | Цитировать Сообщить модератору
 RE:оператор GO  [new]
Petrovich
Member

Откуда:
Сообщений: 13
Спасибо за ответ. Я правильно думаю, что если в хранимой процедуре два пакета (т.е. один оператор GO), то при ошибке или выходе из второго пакета действия первого сохранятся?
6 авг 01, 02:49    [11471]     Ответить | Цитировать Сообщить модератору
 RE:оператор GO  [new]
Genady
Member

Откуда: Москва
Сообщений: 2005
>Я правильно думаю, что если в хранимой процедуре два пакета (т.е. один оператор GO), то при ошибке или выходе из второго пакета действия первого сохранятся?

Нет, оператором Go Вы покажете серверу, что первый пакет это и есть процедура, выражения, стоящие после этого оператора либо потеряются, либо сервер вернет синтаксическую ошибку (не помню просто точно, что именно произойдет).
6 авг 01, 03:01    [11472]     Ответить | Цитировать Сообщить модератору
 RE:оператор GO  [new]
Petrovich
Member

Откуда:
Сообщений: 13
to Genady: у меня сложилось двоякое впечатление после вашего пояснения. С одной стороны я понял, что после GO процедура имеет свое логическое завершение и после оператора ничего не работает, но тогда с другой стороны зачем после GO что-то писать, а, следовательно, зачем нужен сам GO? Единственным ответом может быть только то, что операторы после GO выполняются в том случае, если перед GO не было никаких действий. Я правильно понял?
6 авг 01, 04:59    [11473]     Ответить | Цитировать Сообщить модератору
 RE:оператор GO  [new]
Garya
Guest
Оператор GO используется как символ, обозначающий конец пакета. В хранимой процедуре не может быть более одного пакета. Оператор GO используется в скриптах для разделения логически завершенных пакетов, а также пакетов, которые не могут быть выполнены как единое целое. Кроме того, этот оператор часто используют при ручном вводе команд через QA. Вместо оператора GO может быть задана любая другая команда, синтаксис которой задается в настройках. GO - это по умолчанию.
6 авг 01, 05:14    [11474]     Ответить | Цитировать Сообщить модератору
 RE:оператор GO  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
Строго говоря, GO - это не оператор, SQL такого слова и не знает. Это просто метка в QA, по ней он запускает пакет на выполнение. Несколько понятней будет если написать

/* бла-бла
GO
бла-бла */

С первого взгляда это просто нечто закоментированное, но на самом деле GO разобьёт запрос на 2 части, в каждой их которых будет по ошибке.
6 авг 01, 07:04    [11475]     Ответить | Цитировать Сообщить модератору
 RE:оператор GO  [new]
AndreP
Guest
Кстати, SQL7 с удовольствием понимает и ; вместо GO
6 авг 01, 14:00    [11476]     Ответить | Цитировать Сообщить модератору
 RE:оператор GO  [new]
alexeyvg
Guest
2 AndreP:
А почему?
Следующий текст не выдаёт ошибок, следовательно, выполняется как один батч.

/* олрло
;
ролорло */
6 авг 01, 15:25    [11477]     Ответить | Цитировать Сообщить модератору
 RE:оператор GO  [new]
Fompro
Member

Откуда:
Сообщений: 363
Пример для ISQL(DB-LIB)
gets(cmd);// get command
//!!!!!!!!!!!!!!!!!!!!!!!!!!!
if(strnicmp(cmd,"go",2) == 0) // is it go
//Пересылка буфера команд SQL Server
dbsqlexec(dbproc);// execute command
else
{
strcat(cmd," ");// go not detected, so put space
// Добавить команду в буфер DBPROCESS
dbcmd(dbproc,cmd);
}
6 авг 01, 15:31    [11478]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: оператор GO  [new]
msleg
Member

Откуда: Москва
Сообщений: 564
Коллеги подскажите, правильно я понял или нет?

Допусти есть скрипт, с 2 GO (т.е разделили на два пакета)


Запрос 1 (на обновление)
Запрос 2

GO

Запрос 3
Запрос 4

Go



Теперь вопросы:
1) SQL Server, будет выполнять эти запросы параллельно ([1 потом 2] и параллельно [3 потом 4]) или нет?
2) Если возникнет ошибка в 1 запросе, тогда 3 и 4 выполнятся или нет?
3) Если допустим 1 запрос обновляет данные в таблице, но на 2 запросе происходит ошибка. Изменения 1 сохранятся или нет?
1 мар 17, 11:44    [20253549]     Ответить | Цитировать Сообщить модератору
 Re: оператор GO  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
msleg,

Мы заботимся о слепых
1 мар 17, 11:48    [20253566]     Ответить | Цитировать Сообщить модератору
 Re: оператор GO  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
msleg,

кроме вышеперечисленного вы точно дольше писали вопрос чем взяли бы и проверили
1 мар 17, 11:55    [20253598]     Ответить | Цитировать Сообщить модератору
 Re: оператор GO  [new]
MacaronicTragedy
Member

Откуда:
Сообщений: 99
смотри, попробуй в студии выполнить
скрипт
select * from sgfjdhsgfdhsbgdjsfg
select * from sys.tables

получишь ошибку, что первой таблицы нет (забавно, если будет). и на этом все закончится. второй селект не выполнится. выполнение пакета прекращается.

теперь попробуй:
select * from sgfjdhsgfdhsbgdjsfg
GO
select * from sys.tables

ошибка все равно есть, но теперь второй селект выполнился, т.к. это отдельный пакет.
Далее:

select * from sys.tables

create procedure sp1 as ......

получишь ошибку, т.к. create procedure должна быть первой командой в пакете. вставь между ними go и все отработает.
т.е. если у тебя в одном sql-скрипте создается несколько процедур, без go не обойдешься.

также можно использовать GO n, где n - количество выполнений

попробуй:
create table t1 (c1 int)
GO
insert into t1 values(1)
GO 10

в таблицу вставится 10 строк.
1 мар 17, 12:00    [20253619]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить