SQL脚本中的错误:每批只允许一个语句


128

我有4个SQL脚本,希望在PostDeployment中的DACPAC中运行,但是当我尝试为其中3个构建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”不会执行任何操作。

Answers:


319

我发现了问题。当我在VS中添加文件时,我忘记了Build Action = None从文件属性进行设置。因此,进行更改可以解决问题,并且现在可以编译项目。


26
很棒的收获。哇,微软,认真吗?该错误或其消息如何以任何方式,形状或形式直观显示?
Mike K

9
感谢您对“忘记”的使用感到困惑,但我对此感到困惑,因为人们首先知道这是必要的吗?
小资

2
因为我前段时间做过类似的脚本,并且有人告诉我有关构建操作的问题:)
Cosmin Ionascu 2014年

这已经解决了我的问题。竖起大拇指!
dance2die

3
太好了!拯救了我的一天。对于此类错误消息,MSBuild感到羞愧
Dio Phung 2015年

8

不管这似乎已经很老了,我也坚持了几个小时,我认为这种方式可能对很多人有帮助。

在中Database project,将设置为的文件Build被视为数据库结构,因此设计使该文件仅允许一个语句。Go任何其他批处理终止程序都不会更改该行为,该消息只是错误。更多信息在这里。

在此类项目中,文件还有许多其他构建选项。对于您来说,似乎PostDeploy。在这样的文件中,您可以使用诸如insertsetc之类的各种命令。

然后,您可以将数据库项目的输出用作数据层DB应用程序的dacpac文件(否则不包括在内)。


-3

从每个语句的末尾删除;(分号),我不确定,但是上述插入语句之间不需要GO。


做到了。什么也没做。我知道不需要GO,但是我尝试了一下,因为我在此上浪费了两个多小时。
Cosmin Ionascu 2013年

4
每个语句后都包括分号是标准语法,并且已经提倡多年。由于缺少分号,有2件事出错了。建议开发人员不要在最佳实践中使用分号,这是有问题的。
布兰登2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.