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.

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.


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).


-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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.