J'ai lu et lu sur MSDN, etc. Ok, donc ça signale la fin d'un lot.
Qu'est-ce qui définit un lot? Je ne vois pas pourquoi je dois y aller quand je colle un tas de scripts à exécuter tous en même temps.
Je n'ai jamais compris GO. Quelqu'un peut-il mieux expliquer cela et quand je dois l'utiliser (après combien ou quel type de transactions)?
Par exemple, pourquoi aurais-je besoin de GO après chaque mise à jour ici:
UPDATE [Country]
SET [CountryCode] = 'IL'
WHERE code = 'IL'
GO
UPDATE [Country]
SET [CountryCode] = 'PT'
WHERE code = 'PT'
go
réinitialise / efface égalementdeclare @foo
les déclarations de variables - je devais obtenir que vous deviez déclarer des erreurs @foo , jusqu'à ce que je commente lego
.Réponses:
GO
n'est pas correctement une commande TSQL.Au lieu de cela, c'est une commande au programme client spécifique qui se connecte à un serveur SQL (Sybase ou Microsoft - pas sûr de ce que fait Oracle), signalant au programme client que l'ensemble des commandes qui y ont été entrées jusqu'à ce que le "go" ait besoin à envoyer au serveur pour être exécuté.
Pourquoi / quand en avez-vous besoin?
GO dans le serveur MS SQL a un paramètre "count" - vous pouvez donc l'utiliser comme un raccourci "répéter N fois".
Des mises à jour extrêmement volumineuses peuvent remplir le journal du serveur SQL. Pour éviter cela, il peut être nécessaire de les séparer en lots plus petits via
go
.Dans votre exemple, si la mise à jour d'un ensemble de codes de pays a un volume tel qu'il manquera d'espace de journal, la solution consiste à séparer chaque code de pays en une transaction distincte - ce qui peut être fait en les séparant sur le client avec
go
.Certaines instructions SQL DOIVENT être séparées par GO des suivantes pour fonctionner.
Par exemple, vous ne pouvez pas supprimer une table et recréer la table du même nom en une seule transaction, au moins dans Sybase (idem pour la création de procédures / triggers):
la source
GO
ne "crée pas de transaction pour vous". Si vous ne lancez pas une transaction explicite, chaque instruction créera de toute façon sa propre transaction. C'est complètement orthogonal. Si vous souhaitez diviser une mise à jour plus importante en étapes plus petites, vous pouvez toujours le faire en un seul lot comme dans leWHILE @@ROWCOUNT > 0
modèle commun .UPDATE T1 SET X =2;UPDATE T1 SET X =2;
elle s'exécutera de toute façon comme deux transactions distinctes . L'ajout de neGO
fait absolument aucune différence. Et même , si vous êtes en cours d' exécution dans une transaction explicite , il couvre des lots et encore neGO
fait aucune différence.GO
n'a absolument rien à voir avec les transactions, et rend les réponses au deuxième point sur les transactions et la taille d'un fichier journal incorrecte.GO
n'aura aucun effet. Les première et troisième réponses sont correctes. De plus, vous devez parfois séparer les instructions en lots séparés, par exemple vous ne pouvez pas ajouter une colonne à une table, puis utiliser cette colonne plus tard dans le même lot. (suite)CREATE VIEW
, etc.) doivent être dans leur propre lot.GO
n'est pas une déclaration, c'est un séparateur de lots.Les blocs séparés par
GO
sont envoyés par le client au serveur pour traitement et le client attend leurs résultats.Par exemple, si vous écrivez
, cela sera envoyé au serveur sous forme de
3
requête sur une seule ligne.Si vous écrivez
, cela sera envoyé au serveur sous forme de
3
requêtes sur une ligne.GO
lui-même ne va pas au serveur (sans jeu de mots). C'est un mot réservé pur côté client et n'est reconnu que parSSMS
etosql
.Si vous utilisez un outil de requête personnalisé pour l'envoyer via la connexion, le serveur ne le reconnaîtra même pas et émettra une erreur.
la source
CREATE SCHEMA
); les autres exigent d'être les seules déclarations dans leurs lots (commeSET SHOWPLAN_XML ON
)De nombreuses commandes doivent être dans leur propre lot, comme
CREATE PROCEDURE
Ou, si vous ajoutez une colonne à une table, elle doit être dans son propre lot. Si vous essayez de SELECT la nouvelle colonne dans le même lot, cela échoue car au moment de l'analyse / compilation, la colonne n'existe pas.
GO est utilisé par les outils SQL pour résoudre ce problème à partir d'un seul script: ce n'est pas un mot clé SQL et n'est pas reconnu par le moteur.
Ce sont 2 exemples concrets d'utilisation quotidienne des lots.
Edit: Dans votre exemple, vous n'avez pas besoin de GO ...
Edit 2, exemple. Vous ne pouvez pas supprimer, créer et autoriser dans un seul lot ... surtout, où est la fin de la procédure stockée?
la source
Parfois, il est nécessaire d'exécuter la même commande ou le même ensemble de commandes encore et encore. Cela peut être pour insérer ou mettre à jour des données de test ou cela peut être pour charger votre serveur pour des tests de performances. Quel que soit le besoin, le moyen le plus simple de le faire est de configurer une boucle while et d'exécuter votre code, mais dans SQL 2005, il existe un moyen encore plus simple de le faire.
Supposons que vous souhaitiez créer une table de test et la charger avec 1000 enregistrements. Vous pouvez émettre la commande suivante et elle exécutera la même commande 1000 fois:
source: http://www.mssqltips.com/tip.asp?tip=1216
Autre que cela, il marque la "fin" d'un bloc SQL (par exemple dans une procédure stockée) ... Ce qui signifie que vous êtes à nouveau dans un état "propre" ... eG: Paramètres utilisés dans l'instruction avant la réinitialisation du code ( n'est plus défini)
la source
Comme tout le monde l'a déjà dit, "GO" ne fait pas partie de T-SQL. «GO» est un séparateur de lots dans SSMS , une application client utilisée pour soumettre des requêtes à la base de données. Cela signifie que les variables déclarées et les variables de table ne persisteront pas du code avant le "GO" au code suivant.
En fait, GO est simplement le mot par défaut utilisé par SSMS. Cela peut être modifié dans les options si vous le souhaitez. Pour vous amuser un peu, changez l'option sur le système de quelqu'un d'autre pour utiliser "SELECT" comme séparateur de lots au lieu de "GO". Pardonne mon rire cruel.
la source
Il est utilisé pour diviser les blocs logiques. Votre code est interprété en ligne de commande sql et cela indique le prochain bloc de code.
Mais il pourrait être utilisé comme instruction récursive avec un numéro spécifique.
Essayer:
Certaines déclarations doivent être délimitées par GO:
la source