Что такое "партия", и почему используется 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