В чем разница между ";" и "GO" в T-SQL? - PullRequest
47 голосов
/ 05 октября 2009

Я использую ADO.NET, а также утилиту sqlcmd для отправки сценариев SQL в SQL Server 2008. В чем разница между использованием ; и GO для разделения фрагментов SQL?

Ответы [ 7 ]

57 голосов
/ 05 октября 2009

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

Нельзя поместить GO в строку SQL и отправить его как часть объекта команды ADO.NET, так как сам SQL не понимает этого термина. Другой способ продемонстрировать это с помощью профилировщика: настроить некоторые операторы, использующие GO в Query Analyzer / Management Studio, а затем запустить профилировщик при запуске. Вы увидите, что они выдаются на сервер как отдельные команды.

Точка с запятой используется для обозначения конца самого оператора, не обязательно целого пакета.

http://msdn.microsoft.com/en-us/library/ms188037.aspx

35 голосов
/ 05 октября 2009

«GO» похож на; во многих случаях, но на самом деле означает конец партии.

Каждый пакет фиксируется при вызове оператора "GO", поэтому если у вас есть:

SELECT * FROM table-that-does-not-exist;
SELECT * FROM good-table;

в вашем пакете, тогда выбор хорошей таблицы никогда не будет вызван, потому что первый выбор вызовет ошибку.

Если у вас вместо этого было:

SELECT * FROM table-that-does-not-exist
GO
SELECT * FROM good-table
GO

Первый оператор выбора по-прежнему вызывает ошибку, но поскольку второй оператор находится в своем собственном пакете, он все равно будет выполняться.

GO не имеет ничего общего с совершением транзакции.

21 голосов
/ 05 октября 2009

точка с запятой - это разделитель операторов. Предыдущие операторы не обязательно выполняются, когда встречается точка с запятой.

GO

Обозначает конец партии. Выполняет предыдущий пакет операторов, как и при достижении конца блока.

GO 2

Означает выполнение пакета много раз. Я думаю, что использовал эту опцию, может быть, дважды в моей жизни. Опять же, я не DBA по профессии.

8 голосов
/ 25 августа 2015
  1. В SQL Server TSQL (2005 - 2016) имейте в виду, что:

    • Точка с запятой (;) - это block terminator.
    • GO - это пакетный терминатор.
  2. Кроме того, GO можно использовать для многократного вызова одного и того же блока DML с использованием следующего синтаксиса:

GO [количество]

Где [count] - положительное целое число, которое указывает, сколько раз блок команд TSQL, предшествующих указанному GO, должен выполняться снова и снова.

  1. Кроме того, в отличие от точки с запятой, GO является обязательным перед новым DDL, скажем, при создании нового представления, поскольку точка с запятой, разделяющая предыдущие команды, вызовет ошибку. Например:

перетащите #tevent_view
GO
создать представление #another_view ...
-> НЕТ ОШИБОК

Если вы заменили GO точкой с запятой в предыдущем примере, появится следующее сообщение об ошибке:

'CREATE VIEW' должен быть первым оператором в пакете запроса.

4 голосов
/ 05 октября 2009

'GO' обычно используется для обозначения конца пакета операторов SQL, что означает, что вы можете иметь begin transaction и end transaction, упакованные в единый набор операторов, которые могут завершиться с ошибкой или преуспеть вместе.

';' обычно используется для отделения нескольких операторов SQL друг от друга. Это заметно в сценариях SQL, которые должны возвращать несколько наборов записей, таких как `select * from table1; выберите * из таблицы2; ' что приведет к двум отдельным наборам записей на стороне клиента.

2 голосов
/ 12 февраля 2015

Команда GO означает конец партии. Поэтому все переменные, объявленные перед GO, недопустимы после команды GO. Против точки с запятой не заканчивается партия.

Если вы будете использовать команду DML в процедуре, используйте точку с запятой вместо GO. Например:

CREATE PROCEDURE SpMyProc
@myProcParam VARCHAR(20)
AS
DECLARE @myOtherParam INT = 5
;DISABLE TRIGGER ALL ON tMyTable
UPDATE tMyTable SET myVar = @myProcParam, mySecondVar = @myOtherParam
;ENABLE TRIGGER OLL ON tMyTable 
0 голосов
/ 05 октября 2009

Я думал, что; символ разделяет список команд SQL, GO просто инструктирует SQL Server зафиксировать все предыдущие команды.

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