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 :

[SQL2K] [TSQL] Colonne conditionnelle dans une stored procedure


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Par défaut [SQL2K] [TSQL] Colonne conditionnelle dans une stored procedure
    Bonjour,

    j'ai une application bilingue qui apelle une stored procédure. Selon la langue de l'utilisateur, je veux recevoir une colonne plutot qu'un autres

    La seule facon que j'ai trouvé est de passer un code de langue en paramètre et de doubler la requête.

    if @lang = 1
    Select unique_id, nom_L1, .... from Table
    else
    Select unique_id, nom_L2, .... from table

    Je me dis qu'il doit surement y avoir une facon plus efficace de faire cela comme d'affecter une variable qui contient le nom de la colonne du style :
    J'ai essayé ceci, mais ca ne fonctionne pas

    if @lang = 1
    @nomcolonne = 'nom_L1'
    else
    @nomcolonne = 'nom_L2'

    Select unique_id, @nomcolonne, .... from table

    Quelqu'un a une solution?

    Merci
    Martin

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 356
    Par défaut
    Oui, il y a une solution à ton problème. Il faut passer par l'utilisation de requête dynamiques.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    DECLARE @requete VARCHAR(8000)
    IF@lang = 1
    @nomcolonne = 'nom_L1'
    ELSE
    @nomcolonne = 'nom_L2'
     
    SET @requete = 'SELECT unique_id, '+@nomcolonne+', .... FROM table'
    EXECUTE(@requete)
    IF @@ERROR <> 0 
        RETURN -1
    Les requêtes dynamiques sont des constructions de chaînes de caractères. Elles sont exécutés par l'ordre EXECUTE(). De cette manière, on peut construire des requêtes de manière dynamiques en conditionnant des nom de champs, de tables et des clauses.

    ATTENTION : la concaténation ne peut s'opérer que si ta variable est un type chaînes de caractères et que sa valeur est différente de NULL.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 48
    Par défaut
    et pourquoi pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select unique_id,case when @lang = 1 then nom_L1 else nom_L2 end as 'colonne',......from table
    sauf qu'içi le test sera réalisé à chaque enregistrement.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Par défaut
    merci pour les deux exemples concret. En effet, dans les deux cas, ca répond a mon besoin. Par contre, dans le premier cas, je me dis que tant qu'a faire ca, je suis aussi bien préparer ma requête dans ma couche d'affaire et la passé à SQL déjà avec les bonne valeur. Dans le deuxième cas, il me semble que ca doit influencer sur la performance.

    Bref, je crois que je vais plutot batir ma requête dans ma couche d'affaire et la passé à SQL par la suite. Mon seul regret, c'Est que je n'utilise pas une stored procédure de cette facon.

    Merci

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Utilisez une requête unique avec une structure CASE :
    http://sqlpro.developpez.com/cours/sqlaz/select/#L7

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Erreur dans une store procedure
    Par java250r dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 04/07/2012, 18h59
  2. Réponses: 3
    Dernier message: 19/07/2006, 14h28
  3. Comment obtenir la date dans une store proc?
    Par Dnx dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/10/2005, 17h31
  4. colonne affichée dans une liste déroulante
    Par Tierisa dans le forum Access
    Réponses: 4
    Dernier message: 13/10/2005, 16h13
  5. [SQL Server 2000] ajouter une colonne identité dans une vue?
    Par CetTer dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/08/2005, 13h43

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