Error in SQL script: Only one statement is allowed per batch

53,257

Solution 1

I have found the problem. When I added the file in VS I forgot to set Build Action = None from the file properties. So changing that fixed the problem and the project now compiles.

Solution 2

Regardless this seems to be pretty old I stuck for some hours with that as well and I think this way could be helpful for many.

In Database project, files set as Build are considered as Database structure so just one statement is allowed in such file by design. Go nor any other batch terminator will change that behavior, that message is just mistake. More info here.

There is lot of other build options for files in such project. For your case it seems that PostDeploy. In such file you could have various commands like inserts etc.

Then you can use output of Database project as dacpac file for Data-Tier DB applications (Otherwise it's not included).

Solution 3

I ran into this error when using SQL Server Data Tools and it was because I had a post-deployment script that was added to the project wrong.

In the project file, any database objects should have elements like

<Build Include="dbo\tables\mytable.sql"/>

But scripts should have

<None Include="myscript.sql"/>

However I added my script file, it ended up with a Build tag instead of a None. Changing it to None fixed the error.

Share:
53,257

Related videos on Youtube

Cosmin Ionascu
Author by

Cosmin Ionascu

.NET Programmer. Loves Android in the free time.

Updated on November 21, 2020

Comments

  • Cosmin Ionascu
    Cosmin Ionascu over 3 years

    I have 4 sql scripts that I want to run in a DACPAC in PostDeployment, but when I try to build the VS project for 3 of them I get this error:

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

    The scripts contain only INSERT statements in different tables on the DB. And all of them are structured like so

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

    only on different tables and with different data.

    My question is why is VS complaining about 3 of them when all the scripts are the same in terms of syntax and operations?

    PS: Adding 'GO' between statements as the error suggests doesn't do anything.

  • Cosmin Ionascu
    Cosmin Ionascu over 10 years
    Done that. Doesn't do anything. I know GO isn't required, but I tried it because I've wasted more than 2 hours on this.
  • Mike K
    Mike K over 9 years
    Great catch. Wow, Microsoft, seriously?? How is that error or its message intuitive in any way, shape, or form?
  • pettys
    pettys over 9 years
    Appreciate this answer, except I'm confused by the your use of "forgot" -- how in the world is one to know that's necessary in the first place?
  • Cosmin Ionascu
    Cosmin Ionascu over 9 years
    Because I've done a similar script a while ago and someone told me about build action none :)
  • Brandon
    Brandon about 9 years
    Including a semi-colon after each statement is standard syntax and has been advocated for years. There have been 2 many things that went wrong due to missing semi-colons. Advising a developer to not include a semi-colon where a semi-colon is best practice is questionable.
  • Dio Phung
    Dio Phung over 8 years
    Great ! saved my day. And shame on MSBuild for such a misleading message
  • AGS
    AGS about 7 years
    Good catch! I haven't experienced this with other scripts I wrote...Started out of the blue.
  • Jaroslav Kadlec
    Jaroslav Kadlec over 6 years
    By this way you'd make it compile but is it then available in output of project or you're using it just as storage for plain scripts? For me it looks like that this way it's just "Don't touch this file during build".
  • HaBo
    HaBo over 3 years
    But if Build Action is None, we cannot have design mode right?