IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

[syntaxe] Gerer les variables dans une requete


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 13
    Points : 11
    Points
    11
    Par défaut [resolu] [syntaxe] Gerer les variables dans une requete
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE @OK int
    DECLARE @requete varchar(1000)
    DECLARE @test varchar(50)
     
    SET @requete = 'SELECT @OK=count(*) FROM MaTable Where libelle='+@test
    EXEC(@requete)
    Voici l'érreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Serveur : Msg 137, Niveau 15, État 1, Ligne 1
    La variable '@OK' doit être déclarée.
    Explication :
    Je veux assigner à une variable @OK le nombre de lignes de ma table "MaTable", et je suis obligé de stoquer la requete dans une chaine pour prendre en compte la variable @test ...
    Mais j'ai cette erreur ...
    Vous voyez mon erreur/ une autre solution ?

  2. #2
    En attente de confirmation mail
    Inscrit en
    Novembre 2002
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 51
    Points : 58
    Points
    58
    Par défaut Re: [syntaxe] Gerer les variables dans une requete
    Citation Envoyé par rastapopulos
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE @OK int
    DECLARE @requete varchar(1000)
    DECLARE @test varchar(50)
     
    SET @requete = 'SELECT @OK=count(*) FROM MaTable Where libelle='+@test
    EXEC(@requete)
    Voici l'érreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Serveur : Msg 137, Niveau 15, État 1, Ligne 1
    La variable '@OK' doit être déclarée.
    Explication :
    Je veux assigner à une variable @OK le nombre de lignes de ma table "MaTable", et je suis obligé de stoquer la requete dans une chaine pour prendre en compte la variable @test ...
    Mais j'ai cette erreur ...
    Vous voyez mon erreur/ une autre solution ?
    En faisant un EXEC(@requete) l'exécution de la chaîne se fait hors de ta procédure et donc tu 'sors' du contexte de cette procédure initiale, seul endroit où ta variable locale existe.

    Une solution : tu stockes la valeur de ta requête dans une table existante ou qui n'existe pas encore, en l'incluant dans ta chaîne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'insert into count_table select count(*) FROM MaTable Where libelle='+@test
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'select count(*) into count_table FROM MaTable Where libelle='+@test
    Et ensuite tu fais un select sur cette table pour récupérer le résultat.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Je ne suis pas très calée, mais il me semble que tu peux faire tout simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DECLARE @OK int 
    DECLARE @test varchar(50) 
    SELECT @OK=count(*) FROM MaTable Where libelle=@test
    Sans faire de concaténation à moins que test soit un nom de colonne.
    Personnellement j'ai testé cette proc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE procedure MonCount(@param int)
    AS
     
    declare @ok int
    select @ok=Count(*) from EmployeeTerritories where EmployeeId=@param
    print @ok
    GO
    sur Northwind et ça marche très bien
    A+

  4. #4
    En attente de confirmation mail
    Inscrit en
    Novembre 2002
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 51
    Points : 58
    Points
    58
    Par défaut
    C'est vrai que cette solution reste la meilleure (je me demande bien pourquoi je ne l'ai pas conseillée tout de suite : ), celle initialement utilisée ne peut servir que pour des cas très spécifiques.

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Merci à vous d'avoir répondu ça fait plaisir !

    Bon en ce qui concerne mon probleme, je vais m'orienter vers la réponse de mr_qno, car c'est véritablement la seule qui convient à mon probleme ...
    En fait, je dois absolument utiliser la commande EXEC car je réalise d'autres concaténations dans la chaine qui me sert de requete ...

    Voici mon Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    -- ci-dessous, 1 parametre d'entrée de ma procedure stockée
    @id numeric -- identifiant à tester
    [...]
    -- ci-dessous, trois variables locales
    DECLARE @table varchar(32) -- contient le nom de la table à tester
    DECLARE @OK int
    DECLARE @req varchar(100)
    [...]
    SET @req = 'SELECT @OK = count(*) FROM '+@table+' WHERE ID_'+@table+'='+CAST(@id AS VARCHAR)
    EXEC(@req)
    IF @OK = 0 OR @OK IS NULL 
    BEGIN 
     RAISERROR ('Erreur', 16, 1) 
     RETURN 
    END
    [...]
    En fait, il s'agit de faire une procedure qui teste une table dont le nom est récupéré automatiquement. La clé primaire des tables que je veux tester est toujours de la forme :
    Nom Table : MaTable
    clé primaire : ID_MaTable

    Avec cette méthode, je pense que je suis obligé de passer par une table temporaire ...
    Qu'est ce que vous en pensez ?

  6. #6
    En attente de confirmation mail
    Inscrit en
    Novembre 2002
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 51
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par rastapopulos
    Merci à vous d'avoir répondu ça fait plaisir !

    Bon en ce qui concerne mon probleme, je vais m'orienter vers la réponse de mr_qno, car c'est véritablement la seule qui convient à mon probleme ...
    En fait, je dois absolument utiliser la commande EXEC car je réalise d'autres concaténations dans la chaine qui me sert de requete ...

    Voici mon Code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    -- ci-dessous, 1 parametre d'entrée de ma procedure stockée
    @id numeric -- identifiant à tester
    [...]
    -- ci-dessous, trois variables locales
    DECLARE @table varchar(32) -- contient le nom de la table à tester
    DECLARE @OK int
    DECLARE @req varchar(100)
    [...]
    SET @req = 'SELECT @OK = count(*) FROM '+@table+' WHERE ID_'+@table+'='+CAST(@id AS VARCHAR)
    EXEC(@req)
    IF @OK = 0 OR @OK IS NULL 
    BEGIN 
     RAISERROR ('Erreur', 16, 1) 
     RETURN 
    END
    [...]
    En fait, il s'agit de faire une procedure qui teste une table dont le nom est récupéré automatiquement. La clé primaire des tables que je veux tester est toujours de la forme :
    Nom Table : MaTable
    clé primaire : ID_MaTable

    Avec cette méthode, je pense que je suis obligé de passer par une table temporaire ...
    Qu'est ce que vous en pensez ?
    Si ta requête requiert un nom de table qui n'est pas statique, effectivement il devient nécessaire de passer par un EXEC. Et dans ce cas, tu ne peux pas récupérer le résultat dans une variable locale (de par sa définition de variable 'locale' !).

    Tu peux donc utiliser une table temporaire, mais sinon tu peux toujours utiliser un curseur (il me semble que c'est toi qui cherchais à en créer un dynamiquement) pour récupérer le résultat, en créant donc ce curseur dynamiquement.

    A la différence des variables locales, les curseurs ont une certaine persistance (d'ailleurs leur nom ne commence pas par un @ comme les variables locales), et lors de leur déclaration ils deviennent des objets à part entière (je pense qu'ils doivent se trouver dans la base tempdb), c'est pour cela qu'on peut les créer indépendamment du contexte initial (et qu'il faut les désallouer à la fin via DEALLOCATE).

  7. #7
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Avec un pneu de retard ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DECLARE @OK int 
    DECLARE @requete varchar(1000) 
    DECLARE @test varchar(50) 
    set @test='jean'
    print @test
    SET @requete = 'SELECT OK=count(*) FROM MaTable Where no_client=''' +@test + ''''
    print @requete 
    exec (@requete)

    Ce code fonctionne correctement ... attention aux '
    Maintenant je reconnais d'avance que niveau syntaxe , c zarb !

  8. #8
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par vttman
    Avec un pneu de retard ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DECLARE @OK int 
    DECLARE @requete varchar(1000) 
    DECLARE @test varchar(50) 
    set @test='jean'
    print @test
    SET @requete = 'SELECT OK=count(*) FROM MaTable Where no_client=''' +@test + ''''
    print @requete 
    exec (@requete)

    Ce code fonctionne correctement ... attention aux '
    Maintenant je reconnais d'avance que niveau syntaxe , c zarb !
    Le probleme, c'est qu'avec cette méthode, je n'ai pas le résultat dans ma variable @OK. Pour vérifier, ajoute, un "select @OK" apres ton EXEC et tu verra qu'elle contient toujours la valeur NULL. En fait cette méthode permet d'initialiser le nom de la colonne de la table qui affiche le résultat à "OK" mais pas d'initialiser la variable @OK avec le count(*). Du coup, la variable @OK n'est pas utilisée ! D'ailleurs tu peux essayer, si tu enlève la ligne de déclaration de ta variable @OK, tu n'auras pas d'érreurs (enlève aussi le select @OK que je t'ai duit d'ajouter aussi ...).

    Bref, je vais essayer de tenter le coup avec un curseur dynamique, comme me la dit mr_qno (c'était bien moi !) ... On verra bien ... En tout cas si qqn a une suggestion, ou un truc plus simple, n'hésitez pas !

  9. #9
    En attente de confirmation mail
    Inscrit en
    Novembre 2002
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 51
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par vttman
    Avec un pneu de retard ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DECLARE @OK int 
    DECLARE @requete varchar(1000) 
    DECLARE @test varchar(50) 
    set @test='jean'
    print @test
    SET @requete = 'SELECT OK=count(*) FROM MaTable Where no_client=''' +@test + ''''
    print @requete 
    exec (@requete)

    Ce code fonctionne correctement ... attention aux '
    Maintenant je reconnais d'avance que niveau syntaxe , c zarb !
    Syntaxe très zarb, mais qui en fait déclare un alias pour la colonne en question, mais qui ne permet pas de récupérer la valeur du count(*) dans la variable @OK par contre

  10. #10
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Exact j'ai été eu !!!

  11. #11
    En attente de confirmation mail
    Inscrit en
    Novembre 2002
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 51
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par vttman
    Et ça ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    DECLARE @OK int 
    DECLARE @requete varchar(1000) 
    DECLARE @test varchar(50) 
    set @test='jean'
    SET @requete = 'SELECT count(*) FROM MaTable Where no_client=''' +@test + ''''
    exec (@requete)
    set @OK=@@rowcount 
    select @OK as 'OK'
    print @OK
    @@rowcount permet de récupérer le nombre de lignes retournées par la dernière requête qui a été lancée (ici 1).

  12. #12
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 13
    Points : 11
    Points
    11
    Par défaut [resolu]
    Nickel ! C'est parfait !
    C'est THE solution.
    Merci à tous !

  13. #13
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut Re: [resolu]
    Citation Envoyé par rastapopulos
    Nickel ! C'est parfait !
    C'est THE solution.
    Merci à tous !
    Attention dans ce cas il faut remplacer count(*) par *
    pour avoir le bon résultat ...

    DECLARE @OK int
    DECLARE @requete varchar(1000)
    DECLARE @test varchar(50)
    set @test='jean'
    SET @requete = 'SELECT * FROM MaTable Where no_client=''' +@test + ''''
    exec (@requete)
    set @OK=@@rowcount
    select @OK as 'OK'
    print @OK

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] probleme de syntaxe variable dans une requete sql
    Par nico le noob dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 03/09/2010, 13h20
  2. Eviter les doublons dans une requete ?
    Par DrySs dans le forum Requêtes
    Réponses: 1
    Dernier message: 30/03/2006, 05h24
  3. Variable dans une requete
    Par faayy dans le forum Access
    Réponses: 5
    Dernier message: 20/06/2005, 16h54
  4. Éviter les doublons dans une requete
    Par royrremi dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 03/08/2004, 19h37
  5. Mettre a jour les Parametres dans une requete SQL
    Par Tartar Ukid dans le forum C++Builder
    Réponses: 7
    Dernier message: 31/03/2004, 13h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo