Dans SQL Server, quand devez-vous utiliser GO et quand devez-vous utiliser le point-virgule;?

100

J'ai toujours été confus avec quand je devrais utiliser le mot-clé GO après les commandes et si un point-virgule est requis à la fin des commandes. Quelles sont les différences et pourquoi / quand dois-je les utiliser?

Lorsque j'exécute le script Generate dans SQL Server Management Studio, il semble utiliser GO partout, mais pas le point-virgule.

Enfers
la source

Réponses:

93

GOne concerne que SSMS - il ne s'agit pas de Transact SQL réel, il dit simplement à SSMS d'envoyer les instructions SQL entre chacun GOdans des lots individuels de manière séquentielle.

Le ;est un délimiteur d'instruction SQL, mais pour la plupart, le moteur peut interpréter où vos instructions sont interrompues.

La principale exception et l'endroit où le ;est le plus souvent utilisé est avant une instruction d'expression de table commune.

cjk
la source
5
L'accent sur la partie GOn'est pas T-SQL tant qu'il ;est
msarchet
2
Une MERGEinstruction doit être terminée par un point-virgule.
jour du
15
Mise à jour: dans SQL Server 2012, il est déconseillé d'utiliser des points-virgules, ce qui signifie qu'ils seront requis dans la prochaine version. C'est donc une bonne pratique d'utiliser des points-virgules, car cela nécessitera moins de travail en cas de migration (et parce que c'est une norme). Source: technet.microsoft.com/en-us/library/ms143729.aspx ou le livre sur SQL Server 2012: shop.oreilly.com/product/0790145321978.do
Paweł Bulwan
1
SQL 2014 répertorie toujours le point-virgule comme requis pour la prochaine version. Je me demande quand il sera obsolète. technet.microsoft.com/en-us/library/ms143729.aspx
Frank
2
+ buli ne dit pas que ;c'est obsolète, ne PAS l'utiliser est obsolète, c'est-à-dire que cela va devenir obligatoire selon la source.
cjk
78

La raison pour laquelle vous voyez autant de GO dans les scripts DDL générés est due à la règle suivante concernant les lots.

Les instructions CREATE DEFAULT, CREATE FUNCTION, CREATE PROCEDURE, CREATE RULE, CREATE TRIGGER et CREATE VIEW ne peuvent pas être combinées avec d'autres instructions dans un lot. L'instruction CREATE doit commencer le lot. Toutes les autres instructions qui suivent dans ce lot seront interprétées comme faisant partie de la définition de la première instruction CREATE.

L'un des cas d'utilisation de Generated DDL consiste à générer plusieurs objets dans un seul fichier. Pour cette raison, un générateur DDL doit être capable de générer des lots. Comme d'autres l'ont dit, la déclaration GO met fin au lot.

Conrad Frix
la source
10
C'est le seul qui a vraiment répondu au "... quand devriez-vous utiliser GO ...?" partie de la question.
Roimer
Il me semble que GO termine les instructions qui créent des objets contenant du SQL pouvant contenir le; terminateur d'instruction. Dans un autre SGBD, j'ai vu la possibilité de définir la chaîne de terminaison. Par exemple, vous pouvez spécifier que les instructions se terminent par deux caractères pipe ||. Vous pouvez alors lancer CREATE PROCEDURE ... beaucoup de SQL se terminant par; ... || et le double tube termine l'instruction CREATE PROCEDURE. Ma question est donc de savoir si cela est analogue à la déclaration MS GO? Deuxièmement, pouvez-vous redéfinir la chaîne de terminaison dans SQLSERVER?
youcantryreachingme
@youcantryreachingme Je ne sais pas si c'était vrai en 2010 mais il semble que vous le pouvez. Voir SSMS: séparateur de lots . Je ne sais pas quelles sont les limites de cela
Conrad Frix
34

ALLER

Go est un séparateur de lots. Cela signifie que tout ce qui se trouve dans ce lot est local pour ce lot particulier.

Les déclarations de variables, variables de table, etc. ne traversent pas les GOinstructions.

Les tables #Temp sont locales à une connexion, elles s'étendent donc sur les instructions GO.

Point virgule

Un point-virgule est un terminateur d'instruction. Ceci est uniquement utilisé pour identifier qu'une déclaration particulière est terminée.

Dans la plupart des cas, la syntaxe de l'instruction elle-même suffit à déterminer la fin d'une instruction.

Cependant, les CTE exigent que le WITH soit la première instruction, vous avez donc besoin d'un point-virgule avant le WITH.

Raj Plus
la source
4
Une MERGEinstruction doit être terminée par un point-virgule.
jour du
11

Vous devez utiliser un point-virgule pour terminer chaque instruction SQL. Ceci est défini dans les standards SQL,

Bien sûr, le plus souvent, SQL Server vous permet d'omettre le terminateur d'instruction, mais pourquoi adopter de mauvaises habitudes?

Comme d'autres l'ont souligné, l'instruction précédant une expression de table commune (CTE) doit se terminer par un point-virgule. En conséquence, parmi les gens qui n'ont pas complètement adopté le terminateur point-virgule, nous voyons ceci:

;WITH ...

ce qui, je pense, semble vraiment étrange. Je suppose que cela a du sens dans un forum en ligne lorsque vous ne pouvez pas dire la qualité du code dans lequel il sera collé.

En outre, une MERGEinstruction doit être terminée par un point-virgule. Voyez-vous un modèle ici? Voici quelques-uns des nouveaux ajouts à TSQL qui suivent de près les standards SQL. On dirait que l'équipe SQL Server est en train de rendre obligatoire l'utilisation du terminateur point-virgule.

un jour quand
la source
2
" qui, je pense, semble vraiment étrange " - je ne pourrais pas être plus d'accord. Et la répétition constante de cela conduit à d'étranges questions comme celle-ci ou celle-ci
a_horse_with_no_name
SQL Server ne vous permet pas d'être bâclé - il vous permet d'omettre un terminateur d'instruction redondant; T-SQL, comme la plupart des autres SQL, n'est pas du SQL standard pur, qui ressemble plus à une classe de base abstraite - non utilisée en pratique en faveur du propre dialecte du moteur de base de données.
ProfK
@ProfK: merci d'avoir inclus la ponctuation dans votre commentaire, ce qui me facilite la lecture et la compréhension, en particulier les caractères de terminaison de phrase. Bien que votre utilisation des tirets ne soit pas conforme à l'anglais standard ...
jour,
8

GO est un terminateur de lot, un point-virgule est un terminateur d'instruction.

vous utiliserez GO lorsque vous souhaitez avoir plusieurs instructions create proc dans un seul script car create proc doit être la première instruction d'un lot. Si vous utilisez des expressions de table courantes, l'instruction qui précède doit se terminer par un point-virgule

SQLMenace
la source
Une MERGEinstruction doit être terminée par un point-virgule.
jour du