160 votes

Erreur dans le script SQL : Une seule déclaration est autorisée par lot

J'ai 4 sql scripts que je veux exécuter dans un DACPAC en PostDeployment, mais quand j'essaie de construire le projet VS pour 3 d'entre eux, j'obtiens cette erreur :

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

Les scripts contiennent seulement INSERT dans différentes tables de la BD. Et elles sont toutes structurées de la manière suivante

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

seulement sur des tableaux différents et avec des données différentes.

Ma question est de savoir pourquoi VS se plaint de 3 d'entre eux alors que tous les scripts sont les mêmes en termes de syntaxe et d'opérations.

PS : Ajouter 'GO' entre les déclarations comme le suggère l'erreur ne fait rien.

405voto

Cosmin Ionascu Points 3520

J'ai trouvé le problème. Quand j'ai ajouté le fichier dans VS, j'ai oublié de mettre Build Action = None dans les propriétés du fichier. En changeant cela, j'ai résolu le problème et le projet se compile maintenant.

16voto

Jaroslav Kadlec Points 2021

Quoi qu'il en soit, cela semble être assez ancien. J'ai passé quelques heures avec cela aussi et je pense que cette méthode pourrait être utile pour beaucoup.

Sur Database project les fichiers sont définis comme Build sont considérés comme une structure de base de données, de sorte qu'une seule déclaration est autorisée dans un tel fichier par conception. Go ni aucun autre terminateur de lot ne changera ce comportement, ce message est juste une erreur. Plus d'infos ici.

Il y a beaucoup d'autres options de construction pour les fichiers dans un tel projet. Dans votre cas, il semble que PostDeploy . Dans un tel fichier, vous pouvez avoir diverses commandes telles que inserts etc.

Ensuite, vous pouvez utiliser la sortie du projet de base de données comme fichier dacpac pour les applications de base de données (sinon il n'est pas inclus).

8voto

JamesFaix Points 654

J'ai rencontré cette erreur en utilisant SQL Server Data Tools et c'est parce que j'avais un script post-déploiement qui a été ajouté au projet de manière incorrecte.

Dans le fichier du projet, tous les objets de la base de données devraient avoir des éléments comme

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

Mais scripts devrait avoir

<None Include="myscript.sql"/>

Cependant j'ai ajouté mon fichier script, il s'est retrouvé avec une Build au lieu d'une balise None . Le changer en None a corrigé l'erreur.

-3voto

donstack Points 404

Enlevez le ;(point-virgule) de la dernière déclaration et je ne suis pas sûr mais GO n'est pas nécessaire entre les déclarations d'insertion ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X