Выполнение командной строки с GO в конце

#sql #sql-server

#sql #sql-сервер

Вопрос:

Мне нужно выполнить командную строку с использованием команды GO в конце, например

 exec('SELECT * FROM tblTmp where Id = 1 GO')
  

После выполнения у меня есть

Неправильный синтаксис рядом с ‘GO’.

Если я выполню exec('SELECT * FROM tblTmp GO') , все будет в порядке

В чем здесь проблема?

Спасибо.

Ответ №1:

GO это не SQL команда, это разделитель пакетов, понятный таким клиентам, как osql , sqlcmd и SSMS , но не самому движку.

Если вы напишете что-то подобное в SSMS :

 SELECT  1
GO
SELECT  2
GO
  

движок отправляет два пакета с одним оператором в каждом вместо одного пакета с двумя операторами.

В вашем втором запросе GO обрабатывается как псевдоним таблицы tblTmp .

Просто удалите GO из вашего запроса.

Комментарии:

1. Как я могу отправить пакет с использованием exec(‘…’)?

2. @Vyacheslav: путем предоставления текста пакета в качестве аргумента для EXEC , без завершения GO . Вы не можете отправить более одного пакета за один раз EXEC .

Ответ №2:

Вам не нужно использовать GO для одной инструкции SQL. Только когда вы объединяете несколько инструкций в один скрипт, вам нужно использовать разделитель. Кроме того, если вы выполняете их программно, вы должны использовать точку с запятой (;), завершающую оператор вместо GO, для разделения вашего SQL-оператора.

Вот удобная статья SQL Server Central об использовании GO и точки с запятой.

Комментарии:

1. GO разделяет пакеты, в то время как ; разделяет инструкции. Для большинства операторов ( WITH и MERGE являющихся заметными исключениями) вам даже не нужна точка с запятой. Скажем, это: EXEC('SELECT 1 SELECT 2') прекрасно работает даже без точки с запятой.

2. @Quassnoi: немного изменил мою формулировку и добавил ссылку на хорошее обсуждение по теме. Что касается использования точек с запятой, то, похоже, существуют две школы мышления, но я сталкивался с ситуациями, когда добавление точки с запятой к отдельным операторам имело значение. Использование было сложным, сценарии T-SQL с несколькими инструкциями собирались на стороне клиента и отправлялись на сервер для обработки. Хотел бы я вспомнить более подробные сведения, но я этого не делаю.

3. как я уже сказал, WITH и MERGE являются наиболее заметными исключениями, и есть много менее заметных.