Was bringt ein Batch-Separator?
Nachdem ich viele der Antworten gelesen und zu Kommentaren beigetragen habe, denke ich Folgendes.
Die eigentliche Frage lautet: "Was bringt es, eine Charge zu haben?"
Es gibt zwei Implikationen der Stapelverarbeitung, die eine gewisse Bedeutung haben, und es gibt eine zusätzliche Verwendung von go
, die nützlich sein kann:
1. Alle Anweisungen in einem Stapel werden in einem einzigen Ausführungsplan zusammengefasst
Wie sich dies auf Sie als SQL-Entwickler auswirkt, weiß ich nicht. Aber da ist es. Dies hat zur Folge, dass Sie einige Anweisungen nicht im selben Stapel haben können . Beispielsweise können Sie in ALTER
einer Tabelle keine Spalte hinzufügen, dann select
diese Spalte im selben Stapel - weil erstellen, da diese Spalte beim Kompilieren des Ausführungsplans nicht zur Auswahl vorhanden ist.
Ich denke, es gibt ein offenes Argument dafür, ob SQL Server dies selbst erkennen kann, ohne dass Entwickler go
Anweisungen in ihre Skripte aufnehmen müssen. Darüber hinaus heißt es in den Dokumenten, dass ODBC-Verbindungen möglicherweise niemals einen go
Befehl ausgeben . Mir ist nicht klar, wie sich ein über ODBC ausgeführtes Skript verhalten würde, wenn es das gerade angegebene ALTER
/ -Beispiel enthalten würde SELECT
.
2. Lokal deklarierte Variablen existieren nur im Rahmen des Stapels, in dem sie deklariert wurden
Diese beiden Punkte zusammen saugen irgendwie. Ich habe ein Skript, das DB-Strukturen (Tabellen, Prozeduren usw.) erstellt und ändert, und ich möchte zu Beginn des Skripts Variablen deklarieren, die zur Steuerung des Verhaltens des Skripts insgesamt verwendet werden. Sobald ich eine Charge einpacken muss (z. B. aufgrund einerALTER
Anweisung - siehe Punkt 1 oben), fallen diese "Konfigurations" -Variablen aus dem Gültigkeitsbereich und können nicht weiter unten im Skript verwendet werden. Meine Problemumgehung besteht darin, eine Tabelle zu erstellen, die Konfigurationsvariablen in der Tabelle beizubehalten, sie dann vollständig durch mein Skript zu lesen und die Tabelle am Ende zu löschen (falls jemand anderes damit konfrontiert ist).
Diese zweite Implikation kann tatsächlich zum Vorteil genutzt werden. Wenn Ihr Skript viel Arbeit leistet und Sie einfach alle Ihre lokalen Variablen löschen möchten, können Sie einfach eine GO
Anweisung einfügen und dann neue Variablen deklarieren (dh die wiederverwenden) gleiche Namen, wenn Sie das wollen).
3. GO verfügt über einen optionalen Parameter (mit dem Namen "count"), der den Server anweist, die Stapelaktionen mehrmals zu wiederholen
Diese Verwendung scheint eine nette zusätzliche Funktionalität zu sein, die der GO
Anweisung hinzugefügt wurde . Ich glaube, die anfängliche oder primäre Funktion von GO
bezieht sich eher auf die Erstellung eines einzelnen Ausführungsplans, wie in Punkt 1 erwähnt - ansonsten könnte das Schlüsselwort auch so etwas wie sein REPEAT 10
- aber was wiederholen? Der Stapel. Ohne GO
die Angabe eines Stapels konnte ein Wiederholungsbefehl immer nur die vorherige einzelne Anweisung wiederholen. Daher GO
ist eine gute Möglichkeit, Chargen zu wiederholen .
Referenz
All dies ergibt sich aus dem Versuch, die MS-Dokumentation zu GO zu verstehen . Viele der anderen Antworten - hier und bei anderen Fragen - greifen Teile der Dokumentation auf, aber ich denke, die Dokumentation selbst erklärt nicht wirklich, warum das Stapeln überhaupt einen Vorteil hat - daher mein Beitrag zu einem bereits gut kommentierten Frage.
Nachtrag
Nachdem ich das oben Gesagte geschrieben hatte , fand ich die von Microsoft in der GO
Dokumentation erwähnten Regeln für die Verwendung von Stapeln . Auf der verlinkten Seite wird erläutert, dass ein Ausführungsplan aus mehreren Anweisungen besteht. Es heißt auch, dass einzelne Anweisungen in einen neuen Ausführungsplan neu kompiliert werden können (dh von SQL Server, während der Stapel automatisch verarbeitet wird). Wenn Sie beispielsweise einer Anweisung folgen, CREATE TABLE
wird möglicherweise eine INSERT
in diese Tabelle aufgenommen. Diese INSERT
Anweisung wird neu kompiliert, nachdem die Tabelle in der vorherigen Anweisung erstellt wurde.
Dies verstärkt die Idee, dass SQL Server wahrscheinlich jene Szenarien erkennen könnte, in denen ALTER
auf eine Tabelle eine folgt, SELECT
und dass die Datei neu kompiliert werden muss SELECT
(siehe Punkt 1 oben), und möglicherweise passiert genau dies, wenn ODBC verwendet wird (siehe Punkt 1 oben).
Keine dieser neuen Informationen ändert die 3 oben genannten Punkte. Der Link, den ich gerade gegeben habe, enthält zusätzliche Lektüre und endet mit "den Regeln", die diese sind:
Die Anweisungen CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE SCHEMA, CREATE TRIGGER und CREATE VIEW können nicht mit anderen Anweisungen in einem Stapel kombiniert werden. Die Anweisung CREATE muss den Stapel starten. Alle anderen Anweisungen, die in diesem Stapel folgen, werden als Teil der Definition der ersten CREATE-Anweisung interpretiert.
Eine Tabelle kann nicht geändert werden, und dann werden die neuen Spalten im selben Stapel referenziert.
Wenn eine EXECUTE-Anweisung die erste Anweisung in einem Stapel ist, ist das Schlüsselwort EXECUTE nicht erforderlich. Das Schlüsselwort EXECUTE ist erforderlich, wenn die Anweisung EXECUTE nicht die erste Anweisung im Stapel ist.