В SSMS Запуск SQL, который не возвращает строки с инструкциями перехода между, выдает ошибку
Я использую SSMS v17.6 с SQL Server Express v14.0.1000.169.
Когда я запускаю следующее DELETE
заявление:
delete from foo
go
Я получаю ошибку:
Неверный синтаксис рядом с "go".
Но если я выполню подобное SELECT
заявление:
select * from foo
go
Тогда нет ошибки.
Кажется, ошибка происходит с любым утверждением, которое не возвращает результаты. Я проверил настройки выполнения запросов в SSMS, и разделитель пакетов настроен на работу. Кажется, SSMS отправляет на сервер, что не должно делать.
Я видел это на нескольких машинах.
2 ответа
Мне было бы интересно узнать, был ли это единственный сценарий в пакете? Я подозреваю, что символ где-то перед кодом, который вы запускаете, вызывает проблему.
Есть два способа проверить это:
- Откройте новую вкладку в SSMS, введите
delete from foo go
и выполнить. - Добавить терминатор до оператора
;delete from foo go
,
При таких обстоятельствах ошибка все еще происходит?
Возьми GO. Это не оператор T-SQL, это пакетный прерыватель студии управления.
GO keyword is not T-SQL
, но артефакт SQL Server Management Studio, позволяющий разделить выполнение файла сценария на несколько пакетов. Т.е. при запуске файла сценария T-SQL в SSMS операторы запускаются в виде пакетов, разделенных GO
ключевое слово.
Проверьте эту ссылку SQL Server Utilities Statements - GO для получения более подробной информации.
Если вы прочитаете это, вы увидите, что sqlcmd и osql также поддерживают GO. SQL Server не понимает ключевое слово GO.
Поэтому, если вам нужно УДАЛИТЬ таблицу лучше использовать условие WHERE, предложение WHERE указывает, какие записи должны быть удалены. Если вы пропустите предложение WHERE, все записи в таблице будут удалены.
Базовый синтаксис DELETE:
DELETE FROM table_name
WHERE condition;