Ошибка в сценарии SQL: в пакете разрешен только один оператор


128

У меня есть 4 сценария sql, которые я хочу запустить в DACPAC в PostDeployment, но когда я пытаюсь создать проект VS для трех из них, я получаю эту ошибку:

Only one statement is allowed per batch. A batch separator, such as 'GO', might be required between statements.

Скрипты содержат только INSERTоператоры в разных таблицах БД. И все они устроены так

IF NOT EXISTS (SELECT 1 FROM dbo.Criteria WHERE Name = 'Mileage') INSERT INTO dbo.Criteria(Name) VALUES ('Mileage');

только на разных таблицах и с разными данными.

У меня вопрос: почему VS жалуется на 3 из них, когда все сценарии одинаковы с точки зрения синтаксиса и операций?

PS: добавление «GO» между операторами, как предполагает ошибка, ничего не делает.

Ответы:


319

Я нашел проблему. Когда я добавил файл в VS, я забыл установить его Build Action = Noneв свойствах файла. Таким образом, изменение устранило проблему, и теперь проект компилируется.


26
Отличный улов. Ух ты, Microsoft, серьезно ?? Насколько интуитивно понятна эта ошибка или ее сообщение в какой-либо форме или форме?
Mike K

9
Оцените этот ответ, за исключением того, что меня смущает ваше использование слова «забыл» - как вообще можно узнать, что это необходимо?
pettys

2
Потому что я сделал похожий сценарий некоторое время назад, и кто-то сказал мне о сборке, нет :)
Космин Ионаску

Это устранило мою проблему. Недурно!
dance2die

3
Большой ! спас мой день. И позор MSBuild за такое вводящее в заблуждение сообщение
Дио Фунг

8

Несмотря на то, что это кажется довольно старым, я тоже на несколько часов застрял с этим, и я думаю, что этот способ может быть полезен для многих.

В системе Database projectфайлы, заданные как Build, считаются структурой базы данных, поэтому в таком файле допускается использование только одного оператора. Goни какой другой терминатор пакета не изменит это поведение, это сообщение - просто ошибка. Больше информации здесь.

В таком проекте есть много других вариантов сборки файлов. Для твоего случая так кажется PostDeploy. В таком файле могут быть различные команды, например, insertsи т. Д.

Затем вы можете использовать вывод проекта базы данных как файл dacpac для приложений БД уровня данных (в противном случае он не включен).


-3

Удалите; (точка с запятой) из последнего из каждого оператора, и я не уверен, но GO не требуется между указанными выше операторами вставки.


Готово. Ничего не делает. Я знаю, что GO не требуется, но я попробовал, потому что потратил на это более 2 часов.
Cosmin Ionascu

4
Включение точки с запятой после каждого оператора является стандартным синтаксисом и рекомендуется в течение многих лет. Было 2 вещи, которые пошли не так из-за отсутствия точки с запятой. Советовать разработчику не включать точку с запятой там, где точка с запятой является наилучшей практикой, вызывает сомнения.
Брэндон
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.