Fehler im SQL-Skript: Pro Stapel ist nur eine Anweisung zulässig

128

Ich habe 4 SQL-Skripte, die ich in einem DACPAC in PostDeployment ausführen möchte, aber wenn ich versuche, das VS-Projekt für 3 davon zu erstellen, wird folgende Fehlermeldung angezeigt:

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

Die Skripte enthalten nur INSERTAnweisungen in verschiedenen Tabellen in der Datenbank. Und alle sind so aufgebaut

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

nur auf verschiedenen Tabellen und mit verschiedenen Daten.

Meine Frage ist, warum sich VS über drei von ihnen beschwert, wenn alle Skripte in Bezug auf Syntax und Operationen gleich sind.

PS: Das Hinzufügen von 'GO' zwischen Anweisungen, wie der Fehler andeutet, führt zu nichts.

Cosmin Ionascu
quelle

Antworten:

318

Ich habe das Problem gefunden. Als ich die Datei in VS hinzugefügt habe, habe ich vergessen, sie Build Action = Noneüber die Dateieigenschaften festzulegen. Eine Änderung hat das Problem behoben und das Projekt wird nun kompiliert.

Cosmin Ionascu
quelle
26
Großer Fang. Wow, Microsoft, im Ernst? Wie ist dieser Fehler oder seine Botschaft in irgendeiner Weise, Form oder Gestalt intuitiv?
Mike K
9
Schätzen Sie diese Antwort, außer ich bin verwirrt über Ihre Verwendung von "vergessen" - wie in aller Welt muss man wissen, dass dies überhaupt notwendig ist?
Pettys
2
Weil ich vor einiger Zeit ein ähnliches Skript erstellt habe und mir jemand von Build Action None erzählt hat :)
Cosmin Ionascu
Dies hat mein Problem behoben. Daumen hoch!
Dance2die
3
Toll ! hat meinen Tag gerettet. Und Schande über MSBuild für solch eine irreführende Nachricht
Dio Phung
8

Unabhängig davon, dass dies ziemlich alt zu sein scheint, habe ich mich auch einige Stunden damit beschäftigt und ich denke, dass dieser Weg für viele hilfreich sein könnte.

In Database projectwerden Dateien, Builddie als festgelegt wurden, als Datenbankstruktur betrachtet, sodass nur eine Anweisung in einer solchen Datei zulässig ist. GoKein anderer Batch-Terminator wird dieses Verhalten ändern. Diese Nachricht ist nur ein Fehler. Mehr Infos hier.

Es gibt viele andere Erstellungsoptionen für Dateien in einem solchen Projekt. Für Ihren Fall scheint es so PostDeploy. In einer solchen Datei könnten Sie verschiedene Befehle wie insertsetc. haben.

Anschließend können Sie die Ausgabe des Datenbankprojekts als Dacpac-Datei für Data-Tier-DB-Anwendungen verwenden (andernfalls ist sie nicht enthalten).

Jaroslav Kadlec
quelle
-3

Entfernen Sie das; (Semikolon) aus dem letzten jeder Anweisung, und ich bin nicht sicher, aber zwischen den obigen Einfügeanweisungen ist kein GO erforderlich.

Donstack
quelle
Habe das gemacht. Tut nichts. Ich weiß, dass GO nicht erforderlich ist, aber ich habe es versucht, weil ich mehr als 2 Stunden damit verschwendet habe.
Cosmin Ionascu
4
Das Einfügen eines Semikolons nach jeder Anweisung ist Standard-Syntax und wird seit Jahren empfohlen. Es gab 2 viele Dinge, die aufgrund fehlender Semikolons schief gelaufen sind. Es ist fraglich, einem Entwickler zu raten, kein Semikolon einzuschließen, wenn ein Semikolon die beste Vorgehensweise ist.
Brandon