Quelle est l'utilisation de GO dans SQL Server Management Studio et Transact SQL?

363

SQL Server Management Studio insère toujours une commande GO lorsque je crée une requête à l'aide du menu contextuel "Script en tant que". Pourquoi? Que fait réellement GO?

tvanfosson
la source
29
@ChrisF - ce n'est pas un doublon, bien que la réponse acceptée réponde également à cette question. Cette question concerne l'utilisation de "GO" dans une transaction - il s'avère juste que ce n'est pas vraiment une commande SQL du tout. Cette question est beaucoup plus générale et tente de fournir une réponse définitive aux questions sur la commande GO dans SSMS.
tvanfosson
3
Jetez également un œil à ce lien: à quoi servent les instructions de traitement par lots?
Zain Rizvi
Documentation Microsoft: Instructions SQL Server Utilities - GO : Le lot précédant GO s'exécutera le nombre de fois spécifié.
min

Réponses:

304

C'est un terminateur de lot, vous pouvez cependant le changer comme vous le souhaitez texte alternatif

SQLMenace
la source
80
gbn faites-le SELECT et regardez ce qui se passe :-)
SQLMenace
14
Merci! Mais alors quel est l'intérêt de la déclaration GO? Cela peut sembler stupide, mais que signifie «lot de code»? msdn indique qu'après GO, la durée de vie des variables expire. Cela n'a rien à voir avec l'engagement de transaction, n'est-ce pas? Y a-t-il des circonstances où je devrais conserver l'instruction GO dans mes scripts?
kate1138
4
Cela signifie que tous les T-SQL antérieurs s'exécuteront "à la fois". D'après ce que je comprends, il est interchangeable avec un point-virgule (OLEDB / Oracle). Par exemple, si vous disposez d'un grand script de post-déploiement, une instruction GO entre les lignes peut aider la mémoire utilisée dans le script.
Anthony Mason
4
Cette réponse n'explique pas vraiment "ce qu'elle fait réellement" ni pourquoi
Andrew
Après avoir lu la réponse de @tvanfosson: est-il vraiment interchangeable avec le point-virgule?
WoIIe
299

Depuis Management Studio 2005, il semble que vous pouvez utiliser GOavec un intparamètre, comme:

INSERT INTO mytable DEFAULT VALUES
GO 10

Ce qui précède insérera 10 lignes dans mytable. D'une manière générale, GOexécutera les commandes sql associées nfois .

MicSim
la source
199

La commande GO n'est pas une instruction Transact-SQL, mais une commande spéciale reconnue par plusieurs utilitaires MS, y compris l'éditeur de code SQL Server Management Studio.

La commande GO est utilisée pour regrouper les commandes SQL en lots qui sont envoyés ensemble au serveur. Les commandes incluses dans le lot, c'est-à-dire l'ensemble de commandes depuis la dernière commande GO ou le début de la session, doivent être logiquement cohérentes. Par exemple, vous ne pouvez pas définir une variable dans un lot, puis l'utiliser dans un autre car la portée de la variable est limitée au lot dans lequel elle est définie.

Pour plus d'informations, voir http://msdn.microsoft.com/en-us/library/ms188037.aspx .

tvanfosson
la source
37
Dans quelle situation la mise en lots de choses est-elle GOréellement utile?
nicodemus13
3
@ nicodemus13 Voir stackoverflow.com/questions/20711326/…
Zain Rizvi
4
donc si 1 instruction du lot échoue, tout échoue?
MonsterMMORPG
36

GO n'est pas un mot clé SQL.

C'est un séparateur de lots utilisé par les outils clients (comme SSMS) pour diviser le script entier en lots

Répondu plusieurs fois ... exemple 1

gbn
la source
4
Pour ma défense, j'ai parcouru les doublons suggérés avant de soumettre la question - et votre exemple ne s'est pas présenté, ce n'est pas vraiment un doublon, bien que la réponse soit applicable.
tvanfosson
26
Il est difficile de rechercher "GO" ici :-)
gbn
20

Juste pour ajouter aux réponses existantes, lorsque vous créez des vues, vous devez séparer ces commandes en lots en utilisant go, sinon vous obtiendrez l'erreur 'CREATE VIEW' must be the only statement in the batch. Ainsi, par exemple, vous ne pourrez pas exécuter le script sql suivant sansgo

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
la source
Créez également des procédures
Luciano Santos
2
C'est la seule réponse qui répond vraiment à la première partie de la question du PO "... insère toujours une commande GO .... Pourquoi?". Il semble, la plupart du temps, par peur. La seule fois où cela est nécessaire, c'est quand une commande doit être dans son propre lot.
bielawski
7

Go signifie que, quelles que soient les instructions SQL écrites avant et après tout GO précédent, elles iront au serveur SQL pour traitement.

Select * from employees;
GO    -- GO 1

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

Dans l'exemple ci-dessus, les instructions avant GO 1 iront au serveur SQL dans un lot, puis toutes les autres instructions avant GO 2 iront au serveur SQL dans un autre lot. Donc, comme nous le voyons, il a séparé les lots.

ANIL KUMAR
la source
5
Use herDatabase
GO ; 

Le code dit d'exécuter les instructions au-dessus du GOmarqueur. Ma base de données par défaut est myDatabase, donc au lieu d'utiliser myDatabase GOet effectue la requête actuelle pour utiliser herDatabase

TonyP
la source
-8

Voici la magie de GO.

SELECT 'Go'
Go 10

SYNTAXE: Go INT(BatchNumber)

Numéro de lot: aucune

Cela semble simple, cela pourrait vous conduire à Spaghetti si vous codez plus profondément.

Ragul
la source
cela tente d'expliquer l'instruction GOTO telle qu'elle est utilisée dans la programmation (je pense), comme les scripts de commandes .. n'a rien à voir avec l'instruction GO dans SQL Server. GO n'est généralement pas utilisé avec un INT, bien que vous puissiez le faire si vous souhaitez traiter un lot N fois .. donc non, ce n'est pas la "magie" de GO. Il est utilisé pour séparer un script en une série d'exécutions groupées, comme expliqué dans les autres réponses.
Heriberto Lugo