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 :

[ORDER BY] Passage du order by en paramètre du PS


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2006
    Messages : 42
    Points : 39
    Points
    39
    Par défaut [ORDER BY] Passage du order by en paramètre du PS
    Bonjour,

    je souhaite passer mon "order by" en paramètre de ma Procédure stockée. Le soucis est que SQL SERVER n'accepte pas le

    SELECT
    *****
    *****
    *****
    *****
    ORDER BY @Order


    J'ai vu sur le net qu'on pouvait faire
    EXEC('SELECT * FROM blat ORDER BY '+@Order)

    Le soucis est que mes PS font 4 km de long

    Il n'y aurait pas un moyen plus simple ???

  2. #2
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Salut,

    Tu as la solution du CASE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY CASE @Order WHEN 'col1' THEN col1 ELSE col2 END
    fais attention néanmoins aux performances. Le plan d'exécution sera optimisé pour le premier appel de la procédure, donc un ORDER BY plutôt qu'un autre. Le SQL dynamique a "l'avantage" de générer un query plan adapté.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2006
    Messages : 42
    Points : 39
    Points
    39
    Par défaut
    J'essaie de faire pas mal de "bidouilles" du genre :


    SELECT * , @OrderBy, @ASCDESC FROM RF_Logiciel
    ORDER BY CASE @OrderBy
    WHEN 'loglibelle ASC' then loglibelle ASC
    WHEN 'loglibelle DESC' then loglibelle DESC
    else 'sinum'
    END
    /*****************************************/
    SELECT * FROM RF_Logiciel
    IF(@OrderBy = 'loglibelle' AND @ASCDESC = 'DESC')
    BEGIN
    ORDER BY loglibelle DESC
    END


    IF(@OrderBy = 'loglibelle' AND @ASCDESC = 'ASC')
    BEGIN
    ORDER BY loglibelle ASC
    END


    Mais ça ne marche pas non plus

  4. #4
    Membre éprouvé
    Avatar de HULK
    Inscrit en
    Juillet 2003
    Messages
    1 276
    Détails du profil
    Informations personnelles :
    Âge : 44

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 276
    Points : 1 281
    Points
    1 281
    Par défaut
    Il me semble que tu ne peut pas faire autrement qu'en SQL dynamique (avec le EXEC).

  5. #5
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Ah, désolé, dans le CASE tu ne peux mettre que la colonne, pas le mot-clé ASC ou DESC. Note que tu as aussi une autre contrainte : les colonnes doivent être du même type de données. Si tu te retrouves avec une erreur, utilise CAST ou CONVERT pour uniformiser le type, ou grouper les colonnes de même type dans des cases distincts :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ORDER BY
    CASE WHEN @OrderBy = 1 THEN Numeric1
    WHEN @OrderBy = 2 THEN Numeric2
    END,
    CASE WHEN @OrderBy = 3 THEN VarChar1
    WHEN @OrderBy = 4 THEN VarChar2
    END DESC,
    CASE WHEN @OrderBy = 5 THEN DateTime1
    END
    Pour gérer le problème du ASC ou DESC, tu peux aussi tricher en créant deux colonnes dans le SELECT à l'aide de ton CASE, une pour le ASC, une pour le DESC, contenant la colonne que tu veux trier.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT *,
    CASE @OrderBy
    WHEN 'loglibelle ASC' then loglibelle
    ELSE NULL END as col1
    CASE @OrderBy
    WHEN 'loglibelle DESC' then loglibelle
    ELSE NULL END as col2
    FROM RF_Logiciel
    ORDER BY CASE col1 ASC, col2 DESC
    (code non testé).

    Le principe est que l'une des deux colonnes sera NULL, et l'order by sur cette colonne ne donnera rien.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2006
    Messages : 42
    Points : 39
    Points
    39
    Par défaut
    J'ai essayé le CASE mais ça n'a pas marché, du coup j'ai essayé le EXEC.

    Les modifications furent galères mais j'y suis arrivé !

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

Discussions similaires

  1. [FLASH 8] Pb passage d'une fonction en paramètre
    Par segphault dans le forum Flash
    Réponses: 2
    Dernier message: 17/02/2006, 11h14
  2. Passage de tableau dynamique en paramètre
    Par Didier L dans le forum Langage
    Réponses: 3
    Dernier message: 08/09/2005, 23h04
  3. Passage d'une requete en paramètre dans un delete
    Par jlamazou dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 03/08/2005, 17h58
  4. Réponses: 6
    Dernier message: 26/07/2005, 10h20
  5. Réponses: 7
    Dernier message: 18/05/2005, 15h09

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