Erreur dans le script SQL: une seule instruction est autorisée par lot

128

J'ai 4 scripts sql que je veux exécuter dans un DACPAC dans PostDeployment, mais lorsque j'essaye de créer 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 ne contiennent que des INSERTinstructions dans différentes tables du DB. Et tous sont structurés comme ça

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

uniquement sur des tables différentes et avec des données différentes.

Ma question est pourquoi VS se plaint-il de 3 d'entre eux alors que tous les scripts sont identiques en termes de syntaxe et d'opérations?

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

Cosmin Ionascu
la source

Réponses:

319

J'ai trouvé le problème. Lorsque j'ai ajouté le fichier dans VS, j'ai oublié de définir Build Action = Noneles propriétés du fichier. Donc, changer cela a résolu le problème et le projet se compile maintenant.

Cosmin Ionascu
la source
26
Superbe capture. Wow, Microsoft, sérieusement ?? En quoi cette erreur ou son message est-il intuitif de quelque manière, forme ou forme?
Mike K
9
J'apprécie cette réponse, sauf que je suis confus par votre utilisation de «oublié» - comment diable est-il possible de savoir que c'est nécessaire en premier lieu?
pettys
2
Parce que j'ai fait un script similaire il y a quelque temps et que quelqu'un m'a parlé de build action none :)
Cosmin Ionascu
Cela a résolu mon problème. Pouces vers le haut!
dance2die
3
Génial ! m'a sauvé la journée. Et honte à MSBuild pour un message aussi trompeur
Dio Phung
8

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

Dans Database project, les fichiers définis comme Buildétant considérés comme une structure de base de données, une seule instruction est autorisée dans un tel fichier par conception. Goni aucun autre terminateur de lot ne changera ce comportement, ce message n'est qu'une erreur. Plus d'infos ici.

Il existe de nombreuses autres options de construction pour les fichiers de ce projet. Pour votre cas, il semble que PostDeploy. Dans un tel fichier, vous pourriez avoir diverses commandes comme insertsetc.

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

Jaroslav Kadlec
la source
-3

Supprimez le; (point-virgule) du dernier de chaque instruction et je ne suis pas sûr mais GO n'est pas requis entre les instructions d'insertion ci-dessus.

s'empiler
la source
C'est fait. Ne fait rien. Je sais que GO n'est pas nécessaire, mais je l'ai essayé parce que j'ai perdu plus de 2 heures là-dessus.
Cosmin Ionascu
4
L'inclusion d'un point-virgule après chaque instruction est une syntaxe standard et est préconisée depuis des années. Il y a eu 2 nombreuses choses qui ont mal tourné en raison de points-virgules manquants. Conseiller à un développeur de ne pas inclure un point-virgule où un point-virgule est la meilleure pratique est discutable.
Brandon