#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
являются наиболее заметными исключениями, и есть много менее заметных.