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 :

Requête au sein d'une fonction contenant une variable


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Inscrit en
    Août 2006
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 130
    Points : 86
    Points
    86
    Par défaut Requête au sein d'une fonction contenant une variable
    Bonjour,

    Je souhaite créer une requête qui reçoit en paramètre le nom d'une table dans une variable VARCHAR.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    CREATE FUNCTION maFct(@nomTable AS VARCHAR(150))
    ...
    BEGIN
     
    SELECT * FROM @nomTable
     
    ...
    Mon problème est que logiquement SQL Server me dit que @nomTable n'existe pas ... logique.

    Quelqu'un voit-il une solution ?

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 141
    Points : 176
    Points
    176
    Par défaut
    En effet pour exécuter ce genre de chose, il faut procéder de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE FUNCTION maFct(@nomTable AS VARCHAR(150))
    ...
    BEGIN
     
    EXEC('SELECT * FROM ' + @nomTable)
     
    ...

  3. #3
    Membre régulier
    Inscrit en
    Août 2006
    Messages
    130
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 130
    Points : 86
    Points
    86
    Par défaut
    Ok effectivement ça fonctionne.

    Maintenant si je veux aller un peu plus loin et utiliser cette syntaxe dans le SELECT d'un curseur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DECLARE c CURSOR FOR EXEC('SELECT * FROM' + @nomTable)
    A ce moment la syntaxe n'est plus correcte ...

  4. #4
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    il te faut passer par une table temporaire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    EXEC('SELECT * into #tmp FROM' + @nomTable)
     
    DECLARE c CURSOR FOR select * from #tmp
    Errare humanum est, perseverare diabolicum (Sénèque)

  5. #5
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    en réfléchissant un peu plus

    un curseur select * est impossible car tu ne connais pas le nombre de champs retournés => comment tu feras le fetch ... into @..,@.. ?
    Errare humanum est, perseverare diabolicum (Sénèque)

  6. #6
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    EXEC('SELECT * into #tmp FROM' + @nomTable)
     
    DECLARE c CURSOR FOR SELECT * FROM #tmp
    sans regarder le pb des colonnes qui est le 1er à traiter,
    la #tmp créée dans le EXEC est créée dans un spid différent de celui de la procédure donc tu ne la verras pas lors de la création du curseur. Il faut utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    EXEC('SELECT * into tempdb..table FROM' + @nomTable)
     
    DECLARE c CURSOR FOR SELECT * FROM tempdb..table
    et dropper la table à l'issue du traitement
    Emmanuel T.

Discussions similaires

  1. Réponses: 12
    Dernier message: 08/07/2015, 15h08
  2. Appel d'une fonction dans une fonction d'une même classe
    Par script73 dans le forum Général Python
    Réponses: 3
    Dernier message: 06/03/2015, 10h18
  3. [XL-2003] Changer la police d'une cellule contenant une fonction
    Par BtjpsspgrW dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 25/02/2014, 09h55
  4. Réponses: 10
    Dernier message: 18/06/2012, 18h51
  5. Réponses: 4
    Dernier message: 17/03/2004, 17h24

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