Wann sollten Sie in SQL Server GO und wann Semikolon verwenden?

100

Ich war immer verwirrt darüber, wann ich nach Befehlen das Schlüsselwort GO verwenden sollte und ob am Ende von Befehlen ein Semikolon erforderlich ist. Was sind die Unterschiede und warum / wann sollte ich sie verwenden?

Wenn ich das Generate-Skript in SQL Server Management Studio ausführe, scheint es überall GO zu verwenden, aber nicht das Semikolon.

Hades
quelle

Antworten:

93

GObezieht sich nur auf SSMS - es ist kein tatsächliches Transact SQL, es weist SSMS lediglich an, die SQL-Anweisungen nacheinander GOin einzelnen Stapeln nacheinander zu senden .

Das ;ist ein SQL-Anweisungsbegrenzer, aber zum größten Teil kann die Engine interpretieren, wo Ihre Anweisungen aufgeteilt sind.

Die Hauptausnahme und der Ort, an dem ;das am häufigsten verwendet wird, ist vor einer Common Table Expression-Anweisung.

cjk
quelle
5
Schwerpunkt auf dem GOnicht T-SQL - Part während ;ist
msarchet
2
Eine MERGEAnweisung muss durch ein Semikolon abgeschlossen werden.
Tag, wenn
15
Update: In SQL Server 2012 ist die NICHT-Verwendung von Semikolons veraltet, was bedeutet, dass sie in der nächsten Version erforderlich sind. Daher empfiehlt es sich, Semikolons zu verwenden, da im Falle einer Migration weniger Arbeit erforderlich ist (und weil dies ein Standard ist). Quelle: technet.microsoft.com/en-us/library/ms143729.aspx oder das Buch über SQL Server 2012: shop.oreilly.com/product/0790145321978.do
Paweł Bulwan
1
In SQL 2014 wird weiterhin das Semikolon aufgelistet, das für die nächste Version erforderlich ist. Ich frage mich, wann es veraltet sein wird. technet.microsoft.com/en-us/library/ms143729.aspx
Frank
2
+ buli gibt nicht an, dass ;es veraltet ist, NICHT verwendet zu werden, ist veraltet, dh es wird laut Quelle obligatorisch.
cjk
78

Der Grund, warum in generierten DDL-Skripten so viele GOs angezeigt werden, liegt in der folgenden Regel für Stapel.

CREATE DEFAULT-, CREATE FUNCTION-, CREATE PROCEDURE-, CREATE RULE-, CREATE TRIGGER- und CREATE VIEW-Anweisungen können nicht mit anderen Anweisungen in einem Stapel kombiniert werden. Die Anweisung CREATE muss den Stapel beginnen. Alle anderen Anweisungen, die in diesem Stapel folgen, werden als Teil der Definition der ersten CREATE-Anweisung interpretiert.

Einer der Anwendungsfälle für generierte DDL besteht darin, mehrere Objekte in einer einzigen Datei zu generieren. Aus diesem Grund muss ein DDL-Generator in der Lage sein, Stapel zu generieren. Wie andere gesagt haben, beendet die GO-Anweisung den Stapel.

Conrad Frix
quelle
10
Dies ist der einzige, der wirklich antwortete: "... wann sollten Sie GO verwenden ...?" Teil der Frage.
Roimer
Es scheint mir, dass GO Anweisungen beendet, die Objekte mit SQL erstellen, die möglicherweise Folgendes enthalten: Anweisungsabschluss. In einem anderen DBMS habe ich die Möglichkeit gesehen, die Beendigungszeichenfolge festzulegen. Beispielsweise können Sie angeben, dass Anweisungen mit zwei Pipe-Zeichen || enden. Sie könnten dann CREATE PROCEDURE ausgeben ... viel SQL endet mit; ... || und das Doppelrohr beendet die Anweisung CREATE PROCEDURE. Meine Frage ist also, ob dies der MS GO-Aussage entspricht? Zweitens können Sie die Beendigungszeichenfolge in SQLSERVER neu definieren?
youcantryreachingme
@youcantryreachingme Ich weiß nicht, ob dies 2010 wahr war, aber es scheint, dass Sie können. Siehe SSMS: Batch Separator . Ich bin nicht sicher, wo die Grenzen davon sind
Conrad Frix
34

GEHEN

Go ist ein Batch-Separator. Dies bedeutet, dass alles in diesem Stapel lokal für diesen bestimmten Stapel ist.

Deklarationen von Variablen, Tabellenvariablen usw. gelten nicht für GOAnweisungen.

# Temp-Tabellen sind lokal für eine Verbindung, sodass sie sich über GO-Anweisungen erstrecken.

Semikolon

Ein Semikolon ist ein Anweisungsabschluss. Dies wird lediglich verwendet, um zu identifizieren, dass eine bestimmte Anweisung beendet wurde.

In den meisten Fällen reicht die Anweisungssyntax selbst aus, um das Ende einer Anweisung zu bestimmen.

CTEs verlangen jedoch, dass das WITH die erste Anweisung ist, sodass Sie vor dem WITH ein Semikolon benötigen.

Raj Mehr
quelle
4
Eine MERGEAnweisung muss durch ein Semikolon abgeschlossen werden.
Tag, wenn
11

Sie sollten ein Semikolon verwenden, um jede SQL-Anweisung zu beenden. Dies ist in den SQL-Standards definiert.

Sicher, in SQL Server können Sie häufig den Anweisungsabschluss weglassen, aber warum sollten Sie schlechte Gewohnheiten entwickeln?

Wie andere bereits betont haben, muss die Anweisung vor einem Common Table Expression (CTE) mit einem Semikolon abgeschlossen werden. Infolgedessen sehen wir bei Leuten, die den Semikolon-Terminator nicht vollständig angenommen haben, Folgendes:

;WITH ...

was ich wirklich seltsam finde. Ich nehme an, dass es in einem Online-Forum sinnvoll ist, wenn Sie nicht sagen können, in welche Qualität der Code eingefügt wird.

Zusätzlich muss eine MERGEAnweisung durch ein Semikolon abgeschlossen werden. Sehen Sie hier ein Muster? Dies sind einige der neueren Ergänzungen zu TSQL, die den SQL-Standards genau folgen. Es sieht so aus, als würde das SQL Server-Team die Verwendung des Semikolon-Terminators vorschreiben.

eines Tages, wenn
quelle
2
" was ich wirklich seltsam finde " - mehr kann ich nicht sagen. Und die ständige Wiederholung führt zu seltsamen Fragen wie dieser oder jener
a_horse_with_no_name
Mit SQL Server können Sie nicht schlampig sein - Sie können einen redundanten Anweisungsabschluss weglassen. T-SQL ist wie die meisten anderen SQLs kein reines Standard-SQL, das eher einer abstrakten Basisklasse ähnelt - in der Praxis nicht zugunsten des eigenen Dialekts der DB-Engine verwendet.
ProfK
@ProfK: Vielen Dank, dass Sie die Interpunktion in Ihren Kommentar aufgenommen haben, damit ich sie leichter lesen und verstehen kann, insbesondere die Satzabschlusszeichen. Obwohl Ihre Verwendung von Bindestrichen nicht dem Standard-Englisch entspricht ...
am
8

GO ist ein Batch-Terminator, ein Semikolon ist ein Anweisungs-Terminator.

Sie verwenden GO, wenn Sie mehrere create proc-Anweisungen in einem Skript haben möchten, da create proc die erste Anweisung in einem Stapel sein muss. Wenn Sie allgemeine Tabellenausdrücke verwenden, muss die Anweisung davor mit einem Semikolon abgeschlossen werden

SQLMenace
quelle
Eine MERGEAnweisung muss durch ein Semikolon abgeschlossen werden.
Tag, wenn