Was ist die Verwendung von GO in SQL Server Management Studio und Transact SQL?

363

SQL Server Management Studio fügt immer einen GO-Befehl ein, wenn ich eine Abfrage über das Kontextmenü "Skript als" erstelle. Warum? Was macht GO eigentlich?

Tvanfosson
quelle
29
@ChrisF - das ist kein Duplikat, obwohl die akzeptierte Antwort auch diese Frage beantwortet. Bei dieser Frage geht es um die Verwendung von "GO" in einer Transaktion - es stellt sich nur heraus, dass es sich überhaupt nicht um einen SQL-Befehl handelt. Diese Frage ist viel allgemeiner und versucht, eine endgültige Antwort auf Fragen zum Befehl GO in SSMS zu geben.
Tvanfosson
3
Schauen Sie sich auch diesen Link an: Wofür sind Batching-Anweisungen gut?
Zain Rizvi
Microsoft-Dokumentation: SQL Server-Dienstprogrammanweisungen - GO : Der Stapel vor GO wird die angegebene Anzahl von Malen ausgeführt.
Minuten

Antworten:

304

Es ist ein Batch-Terminator, Sie können ihn jedoch nach Belieben ändern Alt-Text

SQLMenace
quelle
80
gbn machen es SELECT und schauen Sie, was passiert :-)
SQLMenace
14
Vielen Dank! Was ist dann der Sinn der GO-Anweisung? Das mag dumm klingen, aber was bedeutet "Code-Batch"? msdn sagt nach GO, dass die Lebensdauer der Variablen abläuft. Klingt nichts mit Transaktionsverpflichtung zu tun, oder? Gibt es Umstände, unter denen ich die GO-Anweisung in meinen Skripten behalten sollte?
Kate1138
4
Dies bedeutet, dass alle T-SQL-Vorgänge "sofort" ausgeführt werden. Soweit ich weiß, ist es mit einem Semikolon (OLEDB / Oracle) austauschbar. Wenn Sie beispielsweise ein großes Skript nach der Bereitstellung haben, kann eine GO-Anweisung zwischen den Zeilen den im Skript verwendeten Speicher unterstützen.
Anthony Mason
4
Diese Antwort erklärt nicht wirklich "was es tatsächlich tut" oder das Warum
Andrew
Nach dem Lesen der Antwort von @tvanfosson: Ist es wirklich mit Semikolon austauschbar?
WoIIe
299

Da das Management Studio 2005 scheint es , dass Sie verwenden können , GOmit einem intParameter, wie zB:

INSERT INTO mytable DEFAULT VALUES
GO 10

Das obige fügt 10 Zeilen ein mytable. Im Allgemeinen GOwerden die zugehörigen SQL-Befehle nmal ausgeführt .

MicSim
quelle
199

Der Befehl GO ist keine Transact-SQL-Anweisung, sondern ein spezieller Befehl, der von mehreren MS-Dienstprogrammen einschließlich des SQL Editor Management Studio-Code-Editors erkannt wird.

Der Befehl GO wird verwendet, um SQL-Befehle in Stapeln zu gruppieren, die zusammen an den Server gesendet werden. Die im Stapel enthaltenen Befehle, dh der Befehlssatz seit dem letzten GO-Befehl oder dem Start der Sitzung, müssen logisch konsistent sein. Beispielsweise können Sie eine Variable nicht in einem Stapel definieren und dann in einem anderen verwenden, da der Umfang der Variablen auf den Stapel beschränkt ist, in dem sie definiert ist.

Weitere Informationen finden Sie unter http://msdn.microsoft.com/en-us/library/ms188037.aspx .

Tvanfosson
quelle
37
In welcher Situation ist das Stapeln von Dingen GOtatsächlich nützlich?
nicodemus13
3
@ nicodemus13 Siehe stackoverflow.com/questions/20711326/…
Zain Rizvi
4
Wenn also eine Anweisung im Stapel fehlschlägt, schlägt alles fehl?
MonsterMMORPG
36

GO ist kein SQL-Schlüsselwort.

Es ist ein Batch-Trennzeichen, das von Client-Tools (wie SSMS) verwendet wird, um das gesamte Skript in Batches aufzuteilen

Vorher mehrmals beantwortet ... Beispiel 1

gbn
quelle
4
Zu meiner Verteidigung habe ich die vorgeschlagenen Duplikate durchgesehen, bevor ich die Frage eingereicht habe - und Ihr Beispiel wurde nicht angezeigt, und es ist auch kein Duplikat, obwohl die Antwort zutreffend ist.
Tvanfosson
26
Es ist schwer hier nach "GO" zu suchen :-)
gbn
20

goUm die vorhandenen Antworten zu ergänzen, müssen Sie beim Erstellen von Ansichten diese Befehle mithilfe von in Stapel aufteilen , da sonst der Fehler angezeigt wird 'CREATE VIEW' must be the only statement in the batch. So können Sie beispielsweise das folgende SQL-Skript nicht ohne ausführengo

create view MyView1 as
select Id,Name from table1
go
create view MyView2 as
select Id,Name from table1
go

select * from MyView1
select * from MyView2
Mykhailo Seniutovych
quelle
Erstellen Sie auch Prozeduren
Luciano Santos
2
Dies ist die einzige Antwort, die wirklich den ersten Teil der OP-Frage "... fügt immer einen GO-Befehl ein ... Warum?" Es scheint die meiste Zeit aus Angst zu sein. Es ist nur erforderlich, wenn sich ein Befehl in einem eigenen Stapel befinden muss.
Bielawski
7

Go bedeutet, dass alle SQL-Anweisungen, die davor und nach einem früheren GO geschrieben wurden, zur Verarbeitung an den SQL Server gesendet werden.

Select * from employees;
GO    -- GO 1

update employees set empID=21 where empCode=123;
GO    -- GO 2

Im obigen Beispiel werden Anweisungen vor GO 1 in einem Stapel an SQL Server gesendet, und alle anderen Anweisungen vor GO 2 werden in einem anderen Stapel an SQL Server gesendet. Wie wir sehen, hat es Chargen getrennt.

ANIL KUMAR
quelle
5
Use herDatabase
GO ; 

Der Code fordert Sie auf, die Anweisungen über der GOMarkierung auszuführen . Meine Standarddatenbank ist myDatabase. Anstatt also zu verwenden myDatabase GOund aktuelle Abfragen durchzuführen, um herDatabase zu verwenden

TonyP
quelle
-8

Hier ist die Magie von GO.

SELECT 'Go'
Go 10

SYNTAX: Gehen Sie INT(BatchNumber)

BatchNumber: Es ist keine Zeit aufgetreten

Sieht einfach aus. Es könnte Sie zu Spaghetti führen, wenn Sie tiefer codieren.

Ragul
quelle
Dies versucht, die GOTO-Anweisung zu erklären, wie sie in der Programmierung verwendet wird (glaube ich), wie Batch-Skripte. Sie hat nichts mit der GO-Anweisung in SQL Server zu tun. GO wird normalerweise nicht mit einem INT verwendet, obwohl Sie dies können, wenn Sie eine Charge N-mal verarbeiten möchten. Also nein, das ist nicht die "Magie" von GO. Es wird verwendet, um ein Skript in eine Reihe gruppierter Ausführungen zu unterteilen, wie in den anderen Antworten erläutert.
Heriberto Lugo