septembre
2010
GO n’est pas une instruction Transact-SQL, mais une commande reconnue par les utilitaires sqlcmd, osql et l’éditeur de code SQL Server Management Studio (ssms). Les utilitaires SQL Server n’envoient jamais de commande GO au serveur. Les utilitaires SQL Server interprètent GO comme le signal qu’ils doivent envoyer le traitement Transact-SQL en cours à une instance SQL Server. La commande GO est aussi utilisée par les utilitaires SQL Server pour signaler la fin d’un traitement. Les applications basées sur ODBC ou sur les API OLE DB reçoivent une erreur de syntaxe s’ils tentent d’exécuter une commande GO
Voici quelques règles pour l’utilisation de la commande GO (pour les utilitaires SQL Server)
–>Règle N°1: Une instruction T-SQL ne peut pas se trouver sur la même ligne qu’une commande GO
=============================================================================================
–Exemple
————–
Exécuter la requête suivante :
CREATE TABLE dbo.T1 (i INT); GO
–Résultat
————–
Impossible de créer la table T1 : il y a une erreur.
Détail de l’erreur : Syntaxe incorrecte vers ‘GO’.
–Solution : Appliquer la règle N°1
————–
CREATE TABLE dbo.T1 (i INT);
GO
–Solution : NO GO
————–
CREATE TABLE dbo.T1 (i INT);
–>Règle N°2 :Il est impossible de faire référence à une variable locale après un GO
=============================================================================================
–Exemple
————–
Exécuter la requête suivante :
DECLARE @MESSAGE VARCHAR(50)
SET @MESSAGE = 'Test de la règle N°2'
GO
PRINT @MESSAGE
GO
–Résultat
————–
Impossible de faire le PRINT @MESSAGE : Il y a une erreur.
Détail de l’erreur : La variable scalaire « @MESSAGE » doit être déclarée
–Solution : Appliquer la règle N°2
————–
DECLARE @MESSAGE VARCHAR(50)
SET @MESSAGE = 'Test de la règle N°2'
PRINT @MESSAGE
GO
–Solution : NO GO
————–
DECLARE @MESSAGE VARCHAR(50)
SET @MESSAGE = 'Test de la règle N°2'
PRINT @MESSAGE
–>Règle N°3 : Toute exécution d’une procédure stockée faisant suite à la première instruction d’un lot doit soit inclure le mot clé « EXECUTE » ou soit précéder de la commande « GO »
=============================================================================================
–Exemple
————–
Exécuter la requête suivante :
SELECT SUSER_NAME() [Utilisateur];
sp_who
GO
–Résultat
————–
Impossible d’exécuter le sp_who : il y a une erreur.
Détail de l’erreur : Syntaxe incorrecte vers ‘sp_who’.
–Solutions
————–
–1. NO GO
SELECT SUSER_NAME() [Utilisateur];
EXECUTE sp_who
–2. GO
SELECT SUSER_NAME() [Utilisateur];
GO
sp_who
–3. NO GO
sp_who
SELECT SUSER_NAME() [Utilisateur];
–>Règle N°4 : GO X va exécuter X fois le lot d’instructions qui précède GO (Valable pour SQL 2005 et supérieur)
=============================================================================================
–Exemple
————–
Exécuter la requête suivante :
DECLARE @MESSAGE VARCHAR(50)
SET @MESSAGE = 'G 10 va exécuter 10 fois ce message'
PRINT @MESSAGE
GO 10
–Exemple pratique : Chargement d’une table avec INSERT
————–
CREATE TABLE dbo.T2 (ID INT IDENTITY (1,1), ROWID uniqueidentifier);
GO
--Chargement avec INSERT
INSERT INTO dbo.T2 (ROWID) VALUES (NEWID())
GO 100
–Exemple pratique NO GO : Utilisation par exemple WHILE ( i <= 100 ) INSERT ....
————–
Enfin notons que GO est une commande d’utilitaire. Et ne nécessite pas d’autorisation particulière, tout utilisateur peut l’exécuter.
Peut-on éviter d’utiliser GO dans les instructions T-SQL ?
=========================================
Auteur : Etienne ZINZINDOHOUE
=========================================