none
procédure stockée en fonction de parametres RRS feed

  • Question

  • bonjour,

    dans une proc, je dois faire un LEFT JOIN en fonction de la valeur d'un parametre

    si ce param vaut 0 je fais le join
    s'il vaut 1 je ne le fait pas

    comment faire ?

    j'ai essayé avec Case mais j'y arrive pas :-(

    merci
    olivier

     

    samedi 27 novembre 2010 17:35

Réponses

  • j'ai testé les deux : requete contre PROC et la proc est bien plus rapide. pourquoi je sais pas.

    mais bon, maintenant, coté maintenance, je suis d'accors c'est plus galère.

     

    je vais faire mes choix :-)

    merci

    mardi 30 novembre 2010 13:14

Toutes les réponses

  • Bonjour,

    Il serait éventuellement possible dans le left join de mettre le critère que vous voulez pour sélectionner ou pas la table (qq chose comme LEFT JOIN MyTable ON Id=AutreId AND @Param=0 par exemple ce qui fera ou non la jointure selon la table @Param).

    Eventuellement, il pourrait être utile d'expliquer le cas de figure exact. Les champs de la table jointe seront NULL et n'auront donc aucun sens. Personnellement j'aurais plutôt tendance à faire deux procédures stockées différentes, les deux jeux de résultats produits me semblant être conceptuellement totalement différents.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    samedi 27 novembre 2010 19:18
  • Bonjour Olivier

    Ci dessous un exemple qui pourra vous aider dans votre procedure :

    ----------------------------------------
    -------------------TABLES--------------
    ---------------------------------------
    declare @TAB1 Table(id int, nom varchar(50))
    insert @TAB1 
    select 1,'A' UNION ALL
    select 2,'B' UNION ALL
    select 3,'C'
    declare @TAB2 Table(id int, nom varchar(50))
    insert @TAB2 
    select 1,'X' UNION ALL
    select 2,'Y' UNION ALL
    select 4,'Z'
    ----------------------------------------
    -----------------QUERY------------------
    ----------------------------------------
    declare @param int
    set @param=0
    select * from @TAB1 A
    Inner Join @TAB2 B on A.id=B.id and @param=0
    --1 A 1 X
    --2 B 2 Y
    set @param=1
    select * from @TAB1 A
    Inner Join @TAB2 B on A.id=B.id and @param=0
    --Resultat vide
    

     

     


    Best regards
    samedi 27 novembre 2010 19:42
  • bonjour

     

    la table dans le left join doit venir SOIT de la base en cours d'utilisation, SOIT d'une autre base. et ceci en fonction d'un paramètre de la procédure stockée renseignée soit à 0 soit a 1

    sinon, je ferai comme tu le proposes ; faire deux PROC, si j'arrive pas faire la requête ci-dessus

    merci

    olivier


    dimanche 28 novembre 2010 10:34
  • Et pourquoi ne pas faire du SQL dynamique dans ce cas là ?

    ++


    MCDBA | MCITP SQL Server 2005 / SQL Server 2008 | LPI Linux 1
    dimanche 28 novembre 2010 19:47
    Modérateur
  • Et pourquoi ne pas faire du SQL dynamique dans ce cas là ?

    ++


    MCDBA | MCITP SQL Server 2005 / SQL Server 2008 | LPI Linux 1


    heu... je vais chercher ce que c'est ?

    merci


    dimanche 28 novembre 2010 23:00
  • Il s'agit de construire le texte de la requête sous forme d'une chaîne de caractères puis de l'exécuter...

    Ce qui me gêne est que le jeu d'enregistrements retournée sera différent dans les deux cas (si la jointure n'est pas faite certains champs seront par exemple présents mais NULL et donc inutiles). Pour moi il s'agit donc bien de deux requêtes différentes donc deux procédures stockées.

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".

    mardi 30 novembre 2010 08:53
  • bonjour

    ok merci

    mais je souhaiterai le faire dans une PROC, car c'est énormement plus rapide :-)

    olivier

    mardi 30 novembre 2010 09:34
  • Je ne vois en quoi on gagne en rapidité et à mon avis on perd un peu en maintenance. Il va être très simple d'appeler la procédure avec le mauvais paramètre et de traiter des champs qui seront systématiquement NULL car la jointure n'est pas faite. Avec deux procédures, les colonnes seront absentes du jeu de résultat.

    Après chacun est libre de ses préférences ;-)  et le principal est déjà d'obtenir le résultat que vous souhaitez. Est-ce ok de vôtre côté ?


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mardi 30 novembre 2010 13:10
  • j'ai testé les deux : requete contre PROC et la proc est bien plus rapide. pourquoi je sais pas.

    mais bon, maintenant, coté maintenance, je suis d'accors c'est plus galère.

     

    je vais faire mes choix :-)

    merci

    mardi 30 novembre 2010 13:14
  • Ok, la différence que je faisais ne concernait pas l'utilisation ou non de procédures stockées.

    C'était entre avoir une procédure stockée qui retourne des données différentes selon un paramètre ou deux procédures stockées qui retournent chacune les données différentes que l'on veut...

    Après je ne sais pas quel est le test "requête seule" (c'était du SQL dynamique ?). Peut-être à voir plus tard dans une autre discussion si besoin.


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    mardi 30 novembre 2010 15:17