Ich habe MSDN usw. gelesen und gelesen. Ok, es signalisiert das Ende eines Stapels.
Was macht eine Charge aus? Ich verstehe nicht, warum ich gehen muss, wenn ich eine Reihe von Skripten einfüge, die alle gleichzeitig ausgeführt werden sollen.
Ich habe GO nie verstanden. Kann jemand dies besser erklären und wann ich es verwenden muss (nach wie vielen oder welcher Art von Transaktionen)?
Zum Beispiel, warum sollte ich nach jedem Update hier GO brauchen:
UPDATE [Country]
SET [CountryCode] = 'IL'
WHERE code = 'IL'
GO
UPDATE [Country]
SET [CountryCode] = 'PT'
WHERE code = 'PT'
go
auchdeclare @foo
Variablendeklarationen zurücksetzt / löscht - ich habe festgestellt , dass Sie @ foo- Fehler deklarieren müssen , bis ich das auskommentiert habego
.Antworten:
GO
ist nicht richtig ein TSQL-Befehl.Stattdessen ist es ein Befehl an das spezifische Client-Programm der eine Verbindung zu einem SQL-Server (Sybase oder Microsoft - nicht sicher, was Oracle tut) herstellt und dem Client-Programm signalisiert, dass der bis zum Start eingegeben wurde, erforderlich ist an den Server gesendet werden, um ausgeführt zu werden.
Warum / wann brauchst du es?
GO in MS SQL Server verfügt über einen Parameter "count", sodass Sie ihn als Verknüpfung "N-mal wiederholen" verwenden können.
Extrem große Updates füllen möglicherweise das Protokoll des SQL Servers. Um dies zu vermeiden, müssen sie möglicherweise über in kleinere Chargen aufgeteilt werden
go
.Wenn in Ihrem Beispiel die Aktualisierung für eine Reihe von Ländercodes ein solches Volumen aufweist, dass der Protokollspeicherplatz knapp wird, besteht die Lösung darin, jeden Ländercode in eine separate Transaktion zu unterteilen. Dies kann durch Trennen auf dem Client mit erfolgen
go
.Einige SQL-Anweisungen MÜSSEN durch GO von den folgenden getrennt werden, damit sie funktionieren.
Beispielsweise können Sie eine Tabelle nicht löschen und dieselbe gleichnamige Tabelle in einer einzigen Transaktion neu erstellen, zumindest nicht in Sybase (ebenso zum Erstellen von Prozeduren / Triggern):
quelle
GO
erstellt keine "Transaktion für Sie". Wenn Sie nicht in einer expliziten Transaktion ausgeführt werden, erstellt jede Anweisung ohnehin eine eigene Transaktion. Es ist vollständig orthogonal. Wenn Sie ein größeres Update in kleinere Schritte aufteilen möchten, können Sie dies weiterhin in einem einzigen Stapel wie im allgemeinenWHILE @@ROWCOUNT > 0
Muster tun .UPDATE T1 SET X =2;UPDATE T1 SET X =2;
werden, werden diese ohnehin als zwei separate Transaktionen ausgeführt . Das Hinzufügen vonGO
macht absolut keinen Unterschied. Und in ähnlicher Weise , wenn Sie sind in einer expliziten Transaktion läuft es Chargen umspannt und wiederGO
macht keinen Unterschied.GO
absolut nichts mit Transaktionen zu tun hat und die Antworten zum zweiten Punkt über Transaktionen und die Größe einer Protokolldatei falsch macht.GO
wird überhaupt keine Wirkung haben. Die erste und dritte Antwort sind richtig. Darüber hinaus gibt es Zeiten, in denen Sie Anweisungen in separate Stapel aufteilen müssen. Beispielsweise können Sie einer Tabelle keine Spalte hinzufügen und diese Spalte später im selben Stapel verwenden. (Fortsetzung)CREATE VIEW
usw.) müssen in einem eigenen Stapel vorliegen.GO
ist keine Aussage, es ist ein Batch-Trennzeichen.Die durch getrennten Blöcke
GO
werden vom Client zur Verarbeitung an den Server gesendet, und der Client wartet auf ihre Ergebnisse.Zum Beispiel, wenn Sie schreiben
wird dies als
3
einzeilige Abfrage an den Server gesendet .Wenn du schreibst
wird dies als
3
einzeilige Abfrage an den Server gesendet .GO
selbst geht nicht zum Server (kein Wortspiel beabsichtigt). Es ist ein reines clientseitig reserviertes Wort und wird nur von erkanntSSMS
undosql
.Wenn Sie ein benutzerdefiniertes Abfragetool verwenden, um es über die Verbindung zu senden, erkennt der Server es nicht einmal und gibt einen Fehler aus.
quelle
CREATE SCHEMA
). andere erfordern, die einzigen Aussagen in ihren Chargen zu sein (wieSET SHOWPLAN_XML ON
)Viele Befehle müssen in einem eigenen Stapel sein, wie z
CREATE PROCEDURE
Wenn Sie einer Tabelle eine Spalte hinzufügen, sollte sie sich in einem eigenen Stapel befinden. Wenn Sie versuchen, die neue Spalte im selben Stapel auszuwählen, schlägt dies fehl, da die Spalte zum Zeitpunkt der Analyse / Kompilierung nicht vorhanden ist.
GO wird von den SQL-Tools verwendet, um dies aus einem Skript herauszuarbeiten: Es ist kein SQL-Schlüsselwort und wird von der Engine nicht erkannt.
Dies sind zwei konkrete Beispiele für die tägliche Verwendung von Chargen.
Bearbeiten: In Ihrem Beispiel brauchen Sie nicht GO ...
Bearbeiten Sie 2, Beispiel. Sie können nicht in einem Stapel löschen, erstellen und berechtigen ... nicht zuletzt, wo ist das Ende der gespeicherten Prozedur?
quelle
Manchmal muss immer wieder derselbe Befehl oder Befehlssatz ausgeführt werden. Dies kann sein, um Testdaten einzufügen oder zu aktualisieren, oder um Ihren Server für Leistungstests zu belasten. Was auch immer benötigt wird, der einfachste Weg, dies zu tun, besteht darin, eine while-Schleife einzurichten und Ihren Code auszuführen. In SQL 2005 gibt es jedoch einen noch einfacheren Weg, dies zu tun.
Angenommen, Sie möchten eine Testtabelle erstellen und mit 1000 Datensätzen laden. Sie könnten den folgenden Befehl ausgeben, der 1000 Mal denselben Befehl ausführt:
Quelle: http://www.mssqltips.com/tip.asp?tip=1216
Ansonsten markiert es das "Ende" eines SQL-Blocks (z. B. in einer gespeicherten Prozedur) ... Das heißt, Sie befinden sich wieder in einem "sauberen" Zustand ... eG: In der Anweisung verwendete Parameter, bevor der Code zurückgesetzt wird ( nicht mehr definiert)
quelle
Wie bereits gesagt, ist "GO" nicht Teil von T-SQL. "GO" ist ein Batch-Separator in SSMS , einer Client-Anwendung, mit der Abfragen an die Datenbank werden. Dies bedeutet, dass deklarierte Variablen und Tabellenvariablen nicht vom Code vor dem "GO" zum darauf folgenden Code bestehen bleiben.
Tatsächlich ist GO einfach das Standardwort, das von SSMS verwendet wird. Dies kann in den Optionen geändert werden, wenn Sie möchten. Ändern Sie für ein bisschen Spaß die Option auf dem System einer anderen Person, um "SELECT" als Batch-Separator anstelle von "GO" zu verwenden. Vergib mir mein grausames Kichern.
quelle
Es wird verwendet, um logische Blöcke zu teilen. Ihr Code wird in die SQL-Befehlszeile interpretiert und dies zeigt den nächsten Codeblock an.
Es kann jedoch als rekursive Anweisung mit einer bestimmten Nummer verwendet werden.
Versuchen:
Einige Aussagen müssen von GO abgegrenzt werden:
quelle