我有4个sql脚本,我想在PostDeployment中的DACPAC中运行,但是当我尝试为其中3个构建VS项目时,我收到此错误:
Only one statement is allowed per batch. A batch separator, such as 'GO', might be required between statements.
脚本在DB上的不同表中仅包含INSERT
个语句。所有这些都是这样结构的
IF NOT EXISTS (SELECT 1 FROM dbo.Criteria WHERE Name = 'Mileage') INSERT INTO dbo.Criteria(Name) VALUES ('Mileage');
仅适用于不同的表格和不同的数据。
我的问题是,当语法和操作方面的所有脚本相同时,为什么VS抱怨其中的3个?
PS:在语句之间添加“GO”,因为错误表明没有做任何事情。
答案 0 :(得分:244)
我发现了这个问题。当我在VS中添加文件时,我忘了从文件属性中设置Build Action = None
。所以改变这个问题就解决了问题,现在项目正在编译中。
答案 1 :(得分:7)
无论这看起来有多久,我也坚持了几个小时,我认为这种方式对许多人都有帮助。
在Database project
中,设置为Build
的文件被视为数据库结构,因此在设计此类文件时只允许一个语句。 Go
或任何其他批处理终止符都将改变该行为,该消息只是错误。
更多信息here.
此类项目中的文件还有很多其他构建选项。
对于您的情况,似乎PostDeploy
。在这样的文件中,您可以使用各种命令,如inserts
等。
然后,您可以将数据库项目的输出用作数据层数据库应用程序的dacpac文件(否则不包括在内)。
答案 2 :(得分:0)
使用SQL Server数据工具时遇到此错误,这是因为我将错误的部署后脚本添加到了项目中。
在项目文件中,任何数据库对象都应具有类似
的元素<Build Include="dbo\tables\mytable.sql"/>
但是脚本应该具有
<None Include="myscript.sql"/>
但是,我添加了脚本文件,该文件最终以Build
标记而不是None
标记。将其更改为None
可修复该错误。
答案 3 :(得分:-3)
从每个语句的最后一个中删除;(分号),我不确定,但上述插入语句之间不需要GO。