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

Développement SQL Server Discussion :

Exécution d'un SELECT contenu dans une variable.


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 130
    Points : 61
    Points
    61
    Par défaut Exécution d'un SELECT contenu dans une variable.
    Bonjour je viens vers vous car je suis bloqué sur le développement d'une procédure stockée.

    Dans ma procédure je récupère les champs d'une table via un curseur.
    L'un des champs contient une requête (retournant une seule valeur, requête de la forme, SELECT COUNT...)

    J'essaye donc d'affecter le résultat de cette requête à une variable et là je bloque !

    Au départ j'ai essayé ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @nombre_ligne = (@requete)
    la compilation marche bien mais lors de l'exécution le message d'erreur suivant apparait : Échec de la conversion de la valeur varchar 'SELECT count(... en type de données int. . Ce qui parait assez logique au final.

    Du coup j'ai tenté ce code là:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC ('SET @nombre_ligne = (' + @requete + ')')
    Lors de la compilation il n'y a pas d'erreur. Par contre quand j'exécute la message d'erreur suivant apparait : La variable scalaire "@nombre_ligne" doit être déclarée.
    Je précise que je déclare bien la variable au début de la procédure stockée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DECLARE @nombre_ligne int
    Je ne vois vraiment pas comment m'y prendre sans devoir définir un nouveau curseur pour récupérer le résultat de la requête.

    Auriez-vous une idée SVP?

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Vous devez pour cela utiliser la procédure stockée sp_executeSQL, comme je l'ai montré iciVous pouvez aussi vous retourner des valeurs)

    @++

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 130
    Points : 61
    Points
    61
    Par défaut
    Merci elsuket !

    Ca marche un peu mieux....

    Voici le nouveau code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DECLARE @ParamsDef NVARCHAR(64)
    SET @ParamsDef = N'@maValeur int OUTPUT'
    EXEC sp_executeSQL @requete, @ParamsDef, @maValeur = @nombre_ligne OUTPUT;
     
    PRINT 'nb_ligne = ' + convert(varchar(15), @nombre_ligne)
    Le soucis c'est que rien ne s'imprime ! je n'ai pas l'impression de récupérer la valeur.

    De plus, lors de l'exécution de la procédure le résultat de la requête s'affiche (sachant que celle-ci est contenu dans un curseur et donc appelée près d'une 100aine de fois, ce n'est pas intéressant...

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 130
    Points : 61
    Points
    61
    Par défaut
    Pour être plus précis mon but est vraiment de faire la même chose que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET @maVariable = (Select champ FROM table...)
    Sauf que la partie SELECT se trouve dans une variable.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    Malheureusement, vous ne postez pas l'exemple complet.

    Si vous suivez l exemple fournit par elsuket avec la requête bidon ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    declare  @requete nvarchar(255)
    set @requete = 'select @maValeur=count(*) from sys.objects'
     
    DECLARE @ParamsDef NVARCHAR(64), @nombre_ligne int
    SET @ParamsDef = N'@maValeur int OUTPUT'
    EXEC sp_executeSQL @requete, @ParamsDef, @maValeur = @nombre_ligne OUTPUT;
     
    PRINT 'nb_ligne = ' + convert(varchar(15), @nombre_ligne)
    Vous pouvez constater que cela fonctionne. Merci de poster l'intégralité de votre test pour une réponse plus efficace.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 130
    Points : 61
    Points
    61
    Par défaut
    Effectivement je n'ai pas tout à fait le même code
    pour ma part @requete est une variable que je récupère d'un curseur.
    J'ai fait en sorte que les requêtes récupérée soit bien de la forme : SELECT @maValeur=count(.....

    Iden la variable @nombre_ligne est déclarée dès le début de la proc.

    Du coup mon code maintenant est le suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DECLARE @ParamsDef NVARCHAR(64)
    SET @ParamsDef = N'@maValeur int OUTPUT'
    EXEC sp_executeSQL @requete, @ParamsDef, @maValeur = @nombre_ligne OUTPUT;
    PRINT 'nb_ligne = ' + convert(varchar(15), @nombre_ligne)
    Lorsque j'exécute ma procédure stockée, certe les résultats ne s'affichent plus mais toujours pas de Print du nombre de ligne.

    J'ai testé dans une nouvelle fenêtre d'exécution le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    declare  @requete nvarchar(255)
    SET @requete = 'SELECT @maValeur=count(col) FROM  [table] WHERE col2 = ''x''' 
    DECLARE @ParamsDef NVARCHAR(64), @nombre_ligne int
    SET @ParamsDef = N'@maValeur int OUTPUT'
    EXEC sp_executeSQL @requete, @ParamsDef, @maValeur = @nombre_ligne OUTPUT;
    PRINT 'nb_ligne = ' + convert(varchar(15), @nombre_ligne)
    Et là j'ai bien un Print du résultat. ETRANGE !!!

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 130
    Points : 61
    Points
    61
    Par défaut
    Bon ca marche apparemment.
    J'ai rajouté ces deux lignes au dessus du reste:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    declare  @requete nvarchar(255)
    SET @requete = @indicateur_requete_2
    Je reste perplexe quand même.


    Merci kagemaru

Discussions similaires

  1. [PowerShell] Comment exécuter une commande contenue dans une variable ?
    Par mzawo dans le forum Scripts/Batch
    Réponses: 1
    Dernier message: 09/05/2011, 17h58
  2. Exécuter une requête contenue dans une variable
    Par Passepoil dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/07/2010, 20h50
  3. exécuter le code contenu dans une variable
    Par casier dans le forum MATLAB
    Réponses: 2
    Dernier message: 07/11/2009, 00h43
  4. Réponses: 6
    Dernier message: 23/07/2007, 21h56
  5. Réponses: 7
    Dernier message: 11/03/2007, 09h35

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