Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

SQL Server-Fehler 111:„…muss die erste Anweisung in einem Abfragebatch sein“

In SQL Server ist ein Batch eine Gruppe von einer oder mehreren T-SQL-Anweisungen, die gleichzeitig von einer Anwendung zur Ausführung an SQL Server gesendet werden.

Wenn Sie auf einen Fehler wie diesen stoßen:

Msg 111, Level 15, State 1, Line 2
'CREATE VIEW' must be the first statement in a query batch.

Dies liegt wahrscheinlich daran, dass Sie die Anweisung mit anderen Anweisungen im selben Stapel kombinieren, was in Stapeln nicht zulässig ist.

Der erste Teil der Fehlermeldung hängt von der tatsächlichen Anweisung ab, die Sie in Ihrem Stapel verwenden. In meinem Fall ist es CREATE VIEW , aber es könnte genauso gut CREATE PROCEDURE sein , CREATE FUNCTION , usw., wenn Sie diese Anweisungen verwenden.

Beispiel

Hier ist ein Beispiel für einen Code, der diesen Fehler verursachen würde:

DROP VIEW IF EXISTS vAllCustomers;

CREATE VIEW vAllCustomers AS
SELECT * FROM Customers;

Ergebnis:

Msg 111, Level 15, State 1, Line 3
'CREATE VIEW' must be the first statement in a query batch.

In meinem Fall versuche ich, zwei Anweisungen auszuführen; eine DROP VIEW -Anweisung und eine CREATE VIEW Aussage.

Die Regeln eines T-SQL-Stapels besagen, dass die CREATE VIEW -Anweisung kann nicht mit anderen Anweisungen im selben Batch kombiniert werden.

Mit anderen Worten, CREATE VIEW kann die einzige Anweisung in seinem Batch sein.

So beheben Sie den Fehler

Wir können den obigen Fehler beheben, indem wir einfach ein Stapeltrennzeichen nach der ersten Anweisung hinzufügen.

In SQL Server ist das GO Schlüsselwort signalisiert das Ende eines Stapels. Genauer gesagt interpretieren SQL Server-Dienstprogramme GO als Signal, dass sie den aktuellen Stapel von T-SQL-Anweisungen an eine Instanz von SQL Server senden sollen.

Wir könnten also die vorherige Anweisung wie folgt ändern:

DROP VIEW IF EXISTS vAllCustomers;
GO
CREATE VIEW vAllCustomers AS
SELECT * FROM Customers;
GO

Hinzufügen von GO behebt das Problem, indem die Anweisungen in zwei separate Stapel aufgeteilt werden.

Beachten Sie, dass GO ist nicht wirklich Teil von T-SQL. Es ist ein Befehl, der von SQL Server-Dienstprogrammen erkannt wird, um Anweisungen in Stapel aufzuteilen.

Abhängig vom Tool, das Sie zum Herstellen einer Verbindung mit SQL Server verwenden, können Sie möglicherweise das Stapeltrennzeichen ändern. In SSMS finden Sie diese Option beispielsweise unter:Tools> Optionen> Abfrageausführung> SQL-Server und suchen Sie nach einer Option, die so etwas wie „Geben Sie ein Wort oder Zeichen an, das zum Trennen von Stapeln verwendet werden kann“ sagt.