Я прочитал и прочитал через MSDN, и т. Д. Хорошо, таким образом, это сигнализирует об окончании пакета.
Что определяет партию? Я не понимаю, зачем мне идти, когда я вставляю в кучу скриптов, которые запускаются одновременно.
Я никогда не понимал GO. Кто-нибудь может объяснить это лучше и когда мне нужно это использовать (после того, сколько или какого типа транзакций)?
Например, зачем мне GO после каждого обновления здесь:
UPDATE [Country]
SET [CountryCode] = 'IL'
WHERE code = 'IL'
GO
UPDATE [Country]
SET [CountryCode] = 'PT'
WHERE code = 'PT'
go
также сбрасывает / очищаетdeclare @foo
объявления переменных - я получал, что вам нужно объявлять ошибки @foo , пока я не закомментировалgo
.Ответы:
GO
не является правильно командой TSQL.Это команда конкретной клиентской программы. которая подключается к SQL-серверу (Sybase или Microsoft - не уверен в том, что делает Oracle), сигнализируя клиентской программе, что набор команд, которые были введены в нее вплоть до «go», нужен быть отправленным на сервер для выполнения.
Зачем / когда тебе это нужно?
GO на сервере MS SQL имеет параметр «count» - так что вы можете использовать его как ярлык «повторить N раз».
Чрезвычайно большие обновления могут заполнить журнал сервера SQL. Чтобы избежать этого, их, возможно, нужно разделить на более мелкие партии через
go
.В вашем примере, если обновление для набора кодов стран имеет такой объем, что в нем не хватает места в журнале, решение состоит в том, чтобы разделить каждый код страны на отдельную транзакцию - что можно сделать, разделив их на клиенте с помощью
go
.Некоторые операторы SQL ДОЛЖНЫ быть отделены GO от следующих, чтобы работать.
Например, вы не можете удалить таблицу и заново создать таблицу с тем же именем в одной транзакции, по крайней мере в Sybase (то же самое для создания процедур / триггеров):
источник
GO
не "создать транзакцию для вас." Если вы не выполняете явную транзакцию, каждый оператор все равно создаст свою собственную транзакцию. Это полностью ортогонально. Если вы хотите разделить большее обновление на более мелкие этапы, вы все равно можете сделать это в одном пакете, как в общемWHILE @@ROWCOUNT > 0
шаблоне.UPDATE T1 SET X =2;UPDATE T1 SET X =2;
все равно будете работать как две отдельные транзакции . Добавление неGO
имеет абсолютно никакого значения. И точно так же , если вы будете работать в явной транзакции она охватывает партию и сноваGO
не имеет никакого значения.GO
абсолютно не имеет ничего общего с транзакциями, и делает ответы на второй вопрос о транзакциях и размере файла журнала неправильными.GO
не будет иметь никакого эффекта вообще. Первый и третий ответы верны. Кроме того, бывают случаи, когда вам нужно разделить операторы на отдельные пакеты, например, вы не можете добавить столбец в таблицу, а затем использовать этот столбец позже в том же пакете. (продолжение)CREATE VIEW
и т. Д.) Должны быть в их собственной партии.GO
это не утверждение, это разделитель пакетов.Разделенные блоки
GO
отправляются клиентом на сервер для обработки, и клиент ожидает их результатов.Например, если вы пишете
, он будет отправлен на сервер в виде однострочного
3
запроса.Если ты пишешь
, это будет отправлено на сервер в виде
3
однострочных запросов.GO
Сам не идет на сервер (каламбур не предназначен). Это зарезервированное слово на стороне клиента и распознается толькоSSMS
иosql
.Если вы будете использовать пользовательский инструмент запросов для отправки по соединению, сервер даже не распознает его и не выдаст ошибку.
источник
CREATE SCHEMA
); другие требуют быть единственными утверждениями в своих партиях (вродеSET SHOWPLAN_XML ON
)Многие команды должны быть в их собственной партии, как
CREATE PROCEDURE
Или, если вы добавляете столбец в таблицу, он должен быть в своем пакете. Если вы попытаетесь выбрать новый столбец в том же пакете, он потерпит неудачу, потому что во время разбора / компиляции столбец не существует.
GO используется инструментами SQL для решения этой задачи из одного скрипта: это не ключевое слово SQL и не распознается механизмом.
Это 2 конкретных примера ежедневного использования партий.
Редактировать: в вашем примере вам не нужно идти ...
Изменить 2, пример. Вы не можете удалить, создать и разрешить в одном пакете ... не в последнюю очередь, где конец хранимой процедуры?
источник
Иногда возникает необходимость выполнять одну и ту же команду или набор команд снова и снова. Это может быть вставка или обновление тестовых данных, или это может быть нагрузка на ваш сервер для тестирования производительности. Как бы то ни было, самый простой способ сделать это - настроить цикл while и выполнить ваш код, но в SQL 2005 есть еще более простой способ сделать это.
Допустим, вы хотите создать тестовую таблицу и загрузить ее с 1000 записями. Вы можете выполнить следующую команду, и она будет выполняться одну и ту же команду 1000 раз:
источник: http://www.mssqltips.com/tip.asp?tip=1216
Кроме того, он отмечает «конец» блока SQL (например, в хранимой процедуре) ... Это означает, что вы снова в "чистом" состоянии ... Например: параметры, использованные в операторе до сброса кода ( больше не определяется)
источник
Как все уже говорили, «GO» не является частью T-SQL. «GO» - это пакетный разделитель в SSMS , клиентском приложении, используемом для отправки запросов в базу данных. Это означает, что объявленные переменные и табличные переменные не будут сохраняться в коде до того, как "GO" будет кодировать после него.
Фактически, GO - это просто слово по умолчанию, используемое SSMS. Это можно изменить в настройках, если хотите. Для забавы измените параметр в чужой системе, чтобы использовать «SELECT» в качестве разделителя пакетов вместо «GO». Прости мой жестокий смешок.
источник
Используется для разделения логических блоков. Ваш код интерпретируется в командной строке sql, и это указывает на следующий блок кода.
Но это может быть использовано как рекурсивное утверждение с конкретным номером.
Пытаться:
Некоторое утверждение должно быть разграничено GO:
источник