132 votes

Qu'est ce qu'un "lot", et pourquoi VONT-ils utilisés?

J'ai lu et lu sur MSDN, etc. Ok, donc il signale la fin d'un lot.

Ce qui définit un lot? Je ne vois pas pourquoi j'ai besoin d'aller quand je suis coller dans un tas de scripts à exécuter tous en même temps.

Je n'ai jamais compris ALLER. Quelqu'un peut-il expliquer cela mieux et quand j'ai besoin de l'utiliser (après combien ou quel type de transactions)?

Par exemple, pourquoi aurais-je besoin d'ALLER après chaque mise à jour ici:

 UPDATE [Country]
   SET [CountryCode] = 'IL'
 WHERE code = 'IL'

 GO

 UPDATE [Country]
   SET [CountryCode] = 'PT'
 WHERE code = 'PT'

104voto

DVK Points 63282

GO est pas à proprement parler d'une TSQL de commande.

Au lieu de cela c'est une commande spécifique au programme client qui se connecte à un serveur SQL (Sybase ou Microsoft pas sûr de ce que Oracle n'), la signalisation, le programme client que l'ensemble des commandes qui ont été saisies en elle jusqu'à la "go" doivent être envoyés au serveur pour être exécuté.

Pourquoi/quand avez-vous besoin?

  • ALLER dans MS SQL server dispose d'un "compte" paramètre - de sorte que vous pouvez l'utiliser comme une "répétition N fois" raccourci.

  • Très grandes mises à jour pourraient remplir le SQL journal du serveur. Pour éviter cela, ils pourraient devoir être séparés en petits lots via go.

    Dans votre exemple, si la mise à jour d'un ensemble de codes de pays a un tel volume qu'il va manquer d'espace dans le journal, la solution est de séparer chaque pays code dans une transaction distincte qui peut être fait en les séparant sur le client avec go.

  • Certaines instructions SQL DOIVENT être séparés par des ALLER de l'suivantes dans l'ordre de travail.

    Par exemple, vous ne pouvez pas supprimer une table et re-créer le même nom de la table dans une transaction unique, au moins dans Sybase (idem pour la création de procédures ou de déclencheurs):

> drop table tempdb.guest.x1          
> create table tempdb.guest.x1 (a int)
> go
  Msg 2714, Level 16, State 1
  Server 'SYBDEV', Line 2
  There is already an object named 'x1' in the database.   

> drop table tempdb.guest.x1          
> go
> create table tempdb.guest.x1 (a int)
> go
>

25voto

Quassnoi Points 191041

GO n'est pas une déclaration, c'est un séparateur de lot.

Les blocs séparés par GO sont envoyés par le client au serveur pour le traitement et le client attend de leurs résultats.

Par exemple, si vous écrivez

DELETE FROM a
DELETE FROM b
DELETE FROM c

ce sera envoyé au serveur en un seul 3-requête de ligne.

Si vous écrivez

DELETE FROM a
GO
DELETE FROM b
GO
DELETE FROM c

ce seront envoyées au serveur en 3 d'une ligne de requêtes.

GO lui-même ne pas aller sur le serveur (aucun calembour prévu). C'est une pure côté client mot réservé et n'est reconnue que par SSMS et osql.

Si vous allez utiliser un outil de requête pour l'envoyer sur la connexion, le serveur n'a même pas de le reconnaître et d'émettre une erreur.

19voto

gbn Points 197263

Beaucoup de commande doivent être dans leur propre lot, comme CREATE PROCEDURE

Ou, si vous ajoutez une colonne à une table, alors il doit être dans son propre lot. Si vous essayez de SÉLECTIONNER la nouvelle colonne dans le même lot, il échoue parce que lors de l'analyse/moment de la compilation, la colonne n'existe pas.

GO est utilisé par les outils SQL à faire ce travail à partir d'un script: il n'est pas un mot clé SQL et n'est pas reconnu par le moteur.

Ce sont 2 exemples concrets de l'utilisation quotidienne de lots.

Edit: Dans votre exemple, vous n'avez pas besoin d'ALLER...

Edit 2, exemple. Vous ne pouvez pas laisser tomber, de créer et d'autorisation dans un lot... pas moins, où est la fin de la procédure stockée?

IF OBJECT_ID ('dbo.uspDoStuff') IS NOT NULL
    DROP PROCEDURE dbo.uspDoStuff
GO
CREATE PROCEDURE dbo.uspDoStuff
AS
SELECT Something From ATable
GO
GRANT EXECUTE ON dbo.uspDoStuff TO RoleSomeOne
GO

4voto

Steav Points 914

Parfois, il est nécessaire d'exécuter la même commande ou un ensemble de commandes de plus et plus de nouveau. Cela peut être d'insérer ou de mettre à jour les données de test ou il peut être de mettre une charge sur votre serveur pour tester les performances. Quel que soit le besoin de la façon la plus simple pour ce faire est l'installation d'une boucle while et l'exécution de votre code, mais dans SQL 2005 il y a une manière plus simple de faire cela.

Disons que vous voulez créer une table de test et de le charger avec 1000 enregistrements. Vous pouvez également exécuter la commande suivante et il va exécuter la même commande 1000 fois:

CREATE TABLE dbo.TEST (ID INT IDENTITY (1,1), ROWID uniqueidentifier)
GO
INSERT INTO dbo.TEST (ROWID) VALUES (NEWID()) 
GO 1000

source: http://www.mssqltips.com/tip.asp?tip=1216

Autre que cela marque la "fin" de SQL bloc (par exemple dans une procédure stockée)... ce qui Signifie que vous êtes sur un "nettoyage" de l'état de nouveau... e.G: Paramètres utilisés dans la déclaration avant le code de réinitialisation (pas plus définie)

3voto

Comme tout le monde l'a déjà dit, "ALLER" n'est pas une partie de T-SQL. "ALLER" est un séparateur de lots dans SSMS, une application cliente 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 persistera pas de code avant le "GO" pour le code suivant.

En fait, l'ALLER est tout simplement la valeur par défaut de word utilisée par SSMS. Ceci peut être changé dans les options si vous voulez. Pour un peu de fun, de changement de l'option de sur quelqu'un d'autre système pour utiliser "SELECT" comme un élément de séparation de lot au lieu de "ALLER". Pardonnez mon cruel de rire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X