В чем разница между ";" и "GO" в T-SQL?

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

Ответ 1

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

Ответ 2

"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

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

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

Ответ 3

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

GO

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

GO 2

Средство выполняет партию много раз. Кажется, я использовал этот вариант, возможно, дважды в жизни. С другой стороны, я не являюсь администратором базы данных по профессии.

Ответ 4

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

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

Ответ 5

  • В SQL Server TSQL (2005 - 2016) помните, что:

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

GO [count]

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

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

drop view #temporary_view
GO
создать вид #another_view...
→ НЕТ ОШИБКИ

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

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

Ответ 6

Команда 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 

Ответ 7

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