Anweisungen für SQL Server-Hilfsprogramme - GO
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance Azure Synapse Analytics SQL Analytics-Endpunkt in Microsoft Fabric Warehouse in Microsoft Fabric
SQL Server stellt Befehle zur Verfügung, die keine TransactSQL-Anweisungen sind, aber von den Hilfsprogrammen sqlcmd und osql und dem SQL Server Management Studio-Code-Editor erkannt werden. Die Befehle können zur Vereinfachung der Lesbarkeit und Ausführung von Batches und Skripts verwendet werden.
GO signalisiert das Ende eines Batches von Transact-SQL-Anweisungen an die SQL Server-Hilfsprogramme.
Transact-SQL-Syntaxkonventionen
Syntax
GO [count]
Argumente
count
Eine positive ganze Zahl. Der Batch, der GO vorausgeht, wird so oft wie angegeben ausgeführt.
Bemerkungen
GO ist keine Transact-SQL-Anweisung, sondern ein Befehl, der von den Hilfsprogrammen sqlcmd und osql und dem SQL Server Management Studio-Code-Editor erkannt wird.
Die SQL Server-Hilfsprogramme interpretieren GO als ein Signal zum Senden des aktuellen Batches von Transact-SQL-Anweisungen an eine Instanz von SQL Server. Der aktuelle Anweisungsbatch besteht aus allen Anweisungen, die seit dem letzten GO eingegeben wurden. Wenn dies das erste GO ist, besteht er aus allen Anweisungen, die seit dem Beginn der Ad-hoc-Sitzung oder des Skripts eingegeben wurden.
Eine Transact-SQL-Anweisung kann nicht dieselbe Zeile wie ein GO-Befehl belegen. Allerdings kann die Zeile Kommentare enthalten.
Benutzer müssen die Regeln für Batches befolgen. So muss z. B. jede Ausführung einer gespeicherten Prozedur nach der ersten Anweisung in einem Batch das EXECUTE-Schlüsselwort einschließen. Der Bereich von lokalen (benutzerdefinierten) Variablen ist auf einen Batch beschränkt, auf die nicht nach einem GO-Befehl verwiesen werden kann.
USE AdventureWorks2022;
GO
DECLARE @MyMsg VARCHAR(50)
SELECT @MyMsg = 'Hello, World.'
GO -- @MyMsg is not valid after this GO ends the batch.
-- Yields an error because @MyMsg not declared in this batch.
PRINT @MyMsg
GO
SELECT @@VERSION;
-- Yields an error: Must be EXEC sp_who if not first statement in
-- batch.
sp_who
GO
SQL Server-Anwendungen können zum Ausführen eines Batches mehrere Transact-SQL-Anweisungen an eine Instanz von SQL Server senden. Die Anweisungen im Batch werden dann in einen einzelnen Ausführungsplan kompiliert. Programmierer, die Ad-hoc-Anweisungen in den SQL Server-Hilfsprogrammen ausführen oder aus Transact-SQL-Anweisungen Skripts zur Ausführung durch die SQL Server-Hilfsprogramme erstellen, verwenden GO, um das Ende eines Batches zu signalisieren.
Auf den ODBC- oder OLE DB-APIs basierende Anwendungen erhalten einen Syntaxfehler, wenn sie versuchen, einen GO-Befehl auszuführen. Die SQL Server-Hilfsprogramme senden nie einen GO-Befehl an den Server.
Verwenden Sie kein Semikolon als Abschlusszeichen für Anweisung nach GO.
-- Yields an error because ; is not permitted after GO
SELECT @@VERSION;
GO;
Im SQL-Abfrage-Editor des Microsoft Fabric-Portals wird jede SQL-Anweisung als unabhängige Sitzung ausgeführt. Der Sitzungskontext wird nicht über SQL-Anweisungen hinweg beibehalten. Weitere Informationen finden Sie unter SQL-Abfrage-Editor.
Berechtigungen
GO ist ein Hilfsprogrammbefehl, für den keine Berechtigungen erforderlich sind. Der Befehl kann von jedem Benutzer ausgeführt werden.
Beispiele
Im folgenden Beispiel werden zwei Batches erstellt. Der erste Batch enthält nur eine USE AdventureWorks2022
-Anweisung zum Festlegen des Datenbankkontexts. Die verbleibenden Anweisungen verwenden eine lokale Variable. Daher müssen alle Deklarationen von lokalen Variablen in einem einzelnen Batch gruppiert werden. Dies wird erreicht, indem ein GO
-Befehl erst nach der letzten Anweisung, die auf die Variable verweist, ausgeführt wird.
USE AdventureWorks2022;
GO
DECLARE @NmbrPeople INT
SELECT @NmbrPeople = COUNT(*)
FROM Person.Person;
PRINT 'The number of people as of ' +
CAST(GETDATE() AS CHAR(20)) + ' is ' +
CAST(@NmbrPeople AS CHAR(10));
GO
Im folgenden Beispiel werden die Anweisungen im Batch zweimal ausgeführt.
SELECT DB_NAME();
SELECT USER_NAME();
GO 2