Что такое "партия", и почему используется GO?
Я прочитал и прочитал MSDN и т.д. Хорошо, поэтому он сигнализирует о завершении партии.
Что определяет пакет? Я не понимаю, почему мне нужно идти, когда я вставляю в кучу скриптов, которые будут запускаться одновременно.
Я никогда не понимал GO. Может ли кто-нибудь объяснить это лучше и когда мне нужно его использовать (после того, сколько или каких типов транзакций)?
Например, зачем мне нужно GO после каждого обновления здесь:
UPDATE [Country]
SET [CountryCode] = 'IL'
WHERE code = 'IL'
GO
UPDATE [Country]
SET [CountryCode] = 'PT'
WHERE code = 'PT'
Ответы
Ответ 1
GO
является не правильно командой TSQL.
Вместо этого это команда для конкретной клиентской программы, которая подключается к SQL-серверу (Sybase или Microsoft - не уверен в том, что делает Oracle), сигнализируя клиентской программе, что набор команд, которые были ввод в него до тех пор, пока "go" не будет отправлен на сервер, который будет выполнен.
Почему/когда вам это нужно?
-
GO на сервере MS SQL имеет параметр "count", поэтому вы можете использовать его как ярлык "повторить N раз".
-
Чрезвычайно большие обновления могут заполнить журнал SQL-сервера. Чтобы этого избежать, их, возможно, необходимо разделить на меньшие партии через GO
.
В вашем примере, если обновление для набора кодов стран имеет такой том, что он будет исчерпан в лог-пространстве, решение состоит в том, чтобы разделить каждый код страны на отдельную транзакцию - что можно сделать, разделив их на клиент с GO
.
-
Некоторые инструкции SQL ДОЛЖНЫ быть разделены GO из следующих для работы.
Например, вы не можете удалить таблицу и заново создать таблицу с одинаковыми именами в одной транзакции, по крайней мере, в Sybase (для создания процедур/триггеров):
> drop table tempdb.guest.x1
> create table tempdb.guest.x1 (a int)
> go
Msg 2714, Level 16, State 1
Server 'SYBDEV', Line 2
There is already an object named 'x1' in the database.
> drop table tempdb.guest.x1
> go
> create table tempdb.guest.x1 (a int)
> go
>
Ответ 2
GO
не является инструкцией, это разделитель пакетов.
Блоки, разделенные GO
, отправляются клиентом на сервер для обработки, и клиент ждет их результатов.
Например, если вы пишете
DELETE FROM a
DELETE FROM b
DELETE FROM c
это будет отправлено на сервер в виде одного запроса 3
-line.
Если вы пишете
DELETE FROM a
GO
DELETE FROM b
GO
DELETE FROM c
это будет отправлено на сервер как 3
однострочные запросы.
GO
сам не идет на сервер (каламбур не предназначен). Это чистое зарезервированное слово на стороне клиента и распознается только SSMS
и osql
.
Если вы будете использовать специальный инструмент запроса для его отправки по соединению, сервер даже не узнает его и не выдает ошибку.
Ответ 3
Многие команды должны быть в их собственной партии, например CREATE PROCEDURE
Или, если вы добавите столбец в таблицу, тогда он должен быть в своей собственной партии.
Если вы попытаетесь ВЫБРАТЬ новый столбец в той же партии, это терпит неудачу, потому что во время разбора/компиляции столбец не существует.
GO используется SQL-инструментами для работы с одним из script: он не является ключевым словом SQL и не распознается движком.
Это два конкретных примера повседневного использования партий.
Изменить: в вашем примере вам не нужно GO...
Изменить 2, пример. Вы не можете отказаться, создать и разрешить в одной партии... не в последнюю очередь, где находится конец хранимой процедуры?
IF OBJECT_ID ('dbo.uspDoStuff') IS NOT NULL
DROP PROCEDURE dbo.uspDoStuff
GO
CREATE PROCEDURE dbo.uspDoStuff
AS
SELECT Something From ATable
GO
GRANT EXECUTE ON dbo.uspDoStuff TO RoleSomeOne
GO
Ответ 4
Иногда требуется повторять ту же команду или набор команд снова и снова. Это может быть для вставки или обновления тестовых данных, или может потребоваться загрузить нагрузку на ваш сервер для тестирования производительности. Какая бы ни была необходимость, самый простой способ сделать это - настроить цикл while и выполнить свой код, но в SQL 2005 есть еще более простой способ сделать это.
Предположим, вы хотите создать тестовую таблицу и загрузить ее с 1000 записями. Вы можете выполнить следующую команду, и она будет запускать ту же команду 1000 раз:
CREATE TABLE dbo.TEST (ID INT IDENTITY (1,1), ROWID uniqueidentifier)
GO
INSERT INTO dbo.TEST (ROWID) VALUES (NEWID())
GO 1000
Источник:
http://www.mssqltips.com/tip.asp?tip=1216
Кроме того, он отмечает "конец" блока SQL (например, в хранимой процедуре)... Значит, вы снова находитесь в "чистом" состоянии... eG: Параметры, используемые в инструкции перед кодом reset (больше не задано)
Ответ 5
Как все уже сказали, "GO" не является частью T-SQL. "GO" - это разделитель партий в SSMS, клиентское приложение, используемое для отправки запросов в базу данных. Это означает, что объявленные переменные и переменные таблицы не будут сохраняться от кода до "GO" для последующего его кода.
Фактически GO - это просто слово по умолчанию, используемое SSMS. Это можно изменить в параметрах, если хотите. Чтобы немного повеселиться, измените вариант на чужой системе, чтобы использовать "SELECT" в качестве сериализации партии вместо "GO". Простите мой жестокий смешок.
Ответ 6
Используется для разделения логических блоков. Ваш код интерпретируется в командной строке sql, и это указывает следующий блок кода.
Но он может использоваться как рекурсивный оператор с определенным номером.
Try:
exec sp_who2
go 2
Некоторые утверждения должны быть разделены GO:
use DB
create view thisViewCreationWillFail