Erro no script SQL: apenas uma instrução é permitida por lote


128

Eu tenho 4 scripts sql que quero executar em um DACPAC no PostDeployment, mas quando tento criar o projeto VS para 3 deles, recebo este erro:

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

Os scripts contêm apenas INSERTinstruções em tabelas diferentes no banco de dados. E todos eles estão estruturados assim

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

somente em tabelas diferentes e com dados diferentes.

Minha pergunta é por que o VS está reclamando de três deles quando todos os scripts são iguais em termos de sintaxe e operações?

PS: Adicionar 'GO' entre as instruções, conforme o erro sugere, não faz nada.

Respostas:


319

Eu achei o problema. Quando adicionei o arquivo no VS, esqueci de definir Build Action = Noneas propriedades do arquivo. Então, mudar isso corrigiu o problema e o projeto agora é compilado.


26
Ótima captura. Uau, Microsoft, sério? Como esse erro ou sua mensagem é intuitivo de alguma forma, forma ou formato?
Mike K

9
Aprecie esta resposta, exceto que estou confuso com o uso de "esqueci" - como é que se sabe o que é necessário em primeiro lugar?
Pettys

2
Porque eu fiz um script semelhante há um tempo atrás e alguém me falou sobre nenhuma ação de compilação :)
Cosmin Ionascu 20/12/14

Isso corrigiu meu problema. Afirmativo!
dance2die

3
Ótimo ! salvou o meu dia. E vergonha na MSBuild para tal mensagem enganosa
Dio Phung

8

Independentemente disso, parece muito antigo. Fiquei por algumas horas com isso também e acho que dessa maneira poderia ser útil para muitos.

Em Database project, os arquivos definidos como Buildsão considerados como estrutura do banco de dados, portanto, apenas uma instrução é permitida nesse arquivo por design. Gonem qualquer outro terminador de lote alterará esse comportamento, essa mensagem é apenas um erro. Mais informações aqui.

Existem muitas outras opções de compilação para arquivos nesse projeto. Para o seu caso, parece isso PostDeploy. Nesse arquivo, você pode ter vários comandos, como insertsetc.

Em seguida, você pode usar a saída do projeto de banco de dados como arquivo dacpac para aplicativos de banco de dados da camada de dados (caso contrário, não estará incluído).


-3

Remova o; (ponto-e-vírgula) do final de cada instrução e não tenho certeza, mas o GO não é necessário entre as instruções de inserção acima.


Fiz isso. Não faz nada. Sei que o GO não é obrigatório, mas tentei porque perdi mais de 2 horas com isso.
Cosmin Ionascu 9/09/13

4
A inclusão de um ponto-e-vírgula após cada declaração é uma sintaxe padrão e é defendida há anos. Houve duas coisas que deram errado devido à falta de dois pontos. É questionável aconselhar um desenvolvedor a não incluir ponto e vírgula em que o ponto e vírgula é uma prática recomendada.
21315 Brandon
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.