используя ключевое слово GO в SQL Server - PullRequest
6 голосов
/ 04 марта 2011

я знаю использование ключевого слова GO. он отправляет несколько операторов на сервер sql как целую группу, а не отправляет каждый оператор по одному. я надеюсь, что я прав!

но я хочу знать, что программисты используют его в реальных приложениях. например, если мы создаем хранимую процедуру, то это также делает то же самое, она также компилирует код и составляет план выполнения и отправляет всю группу на сервер.

так нужно ли указывать ключевое слово GO в кодировке объектов базы данных, таких как триггеры, представления, хранимые процедуры?

Ответы [ 7 ]

13 голосов
/ 04 марта 2011

GO - команда, используемая для сигнализации об окончании партии. Обратите внимание, что это не оператор T-SQL.

Пакет - это группа из одного или нескольких операторов Transact-SQL, одновременно отправляемых из приложения на SQL Server для выполнения

GO очень полезен в SQL Server. Однако использовать его нужно только тогда, когда это действительно необходимо. Итак, вы должны иметь в виду, что наряду с определением пакета с помощью команды GO вы определяете область действия этого конкретного фрагмента кода T-SQL. Локальные переменные, определенные в пакете, специфичны для этого пакета.

Пример области применения -

DECLARE @STRING1 AS VARCHAR(50)
DECLARE @STRING2 AS VARCHAR(50)

SET @STRING1='BATCH 2'
SET @STRING2='BATCH 3'

SELECT @STRING1 AS RESULT
GO

SELECT @STRING2 AS RESULT
GO

Запуск этого сообщения приведет к ошибке, говорящей, что @ STRING2 не объявлено. Потому что область действия этой переменной заканчивается GO. Так что остерегайтесь использования GO и используйте умно.

Источник - http://aartemiou.blogspot.com/2009/08/using-go-command-in-sql-server.html

7 голосов
/ 04 марта 2011

Ключевое слово GO сигнализирует об окончании пакета в SQL Server Management Studio - обычно SQL Server Management Studio выполняет все операторы в одном пакете (однако пакет можно рассматривать как двустороннюю передачу в базу данных), однако в определенных ситуациях может потребоваться выполнение операторов в разных пакетах (например, оператор SET SHOWPLAN_ALL должен быть единственным оператором в пакете)

Например, выполнение следующего сценария в SQL Server Management Studio:

USE StackOverflow
GO
SELECT * FROM Comments

Примерно эквивалентно выполнению следующих действий в C #:

using (var cmd = new SqlCommand("USE StackOverflow", conn))
{
    cmd.ExecuteReader();
}
using (var cmd = new SqlCommand("SELECT * FROM Comments", conn))
{
    cmd.ExecuteReader();
}    

Обратите внимание, что GO является , а не ключевым словом T-SQL, оно понимается только SQL Server Management Studio и другими инструментами SQL. Например, следующее не будет работать и приведет к исключению времени выполнения:

string cmdText = @"
USE StackOverflow
GO
SELECT * FROM Comments";

using (var cmd = new SqlCommand(cmdText, conn))
{
    cmd.ExecuteReader();
}
4 голосов
/ 04 марта 2011

GO не является ключевым словом в SQL. Для SSMS и других инструментов это директива разбивать больший скрипт на пакеты.

3 голосов
/ 07 марта 2011

Чтобы добавить к тому, что говорили все остальные ... вы не можете использовать GO в хранимой процедуре, триггере, представлении, UDF или даже в динамическом SQL. Он предназначен только для сценариев.

1 голос
/ 04 марта 2011

MSDN Определяет Go как

Сигнализирует об окончании пакета инструкций Transact-SQL для утилит SQL Server.

и идетдалее

GO не является оператором Transact-SQL;это команда, распознаваемая утилитами sqlcmd и osql и редактором кода SQL Server Management Studio.

Утилиты SQL Server интерпретируют GO как сигнал о том, что они должны отправить текущий пакет инструкций Transact-SQL экземпляру SQLСервер.Текущий пакет операторов состоит из всех операторов, введенных с момента последнего GO или с момента начала специального сеанса или сценария, если это первый GO.

Самое распространенное время, когда я использую GOдля сценариев создания объектов

Мои сценарии создания обычно следуют этому шаблону

USE SomeDatabase
GO

If Exists(SELECT * FROM ...)
 DROP

CREATE PROC as foo
BEGIN
END
GO 

Grant exec on Foo to Bar

Так что два GO важны, потому что я хочу убедиться, что я нахожусь на правильной БД, и она победила 'работать без GO.Второй GO жизненно важен, иначе хранимая процедура попытается выполнить оператор предоставления как часть процедуры.

1 голос
/ 04 марта 2011

Нет необходимости указывать директиву GO на сервере SQL.

1 голос
/ 04 марта 2011

Я подозреваю, что вам лучше использовать точку с запятой (;) для разделения операторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...