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 :

Développement d'une fonction aux retours particuliers [2008R2]


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2011
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 89
    Points : 109
    Points
    109
    Par défaut Développement d'une fonction aux retours particuliers
    Bonjour,
    je débute non sans mal dans les fonctions SQL.

    Je tente de développer une fonction SQL qui recevra 2 paramètres à savoir une clé et un nom de langue et renverra soit:
    1) la clé si celle-ci ne commence pas par "@LANG"
    2) la valeur de traduction dans la langue précisée
    3) la valeur de traduction dans une langue par defaut si la valeur dans la langue précisée n'existe pas (et tenter de gerer le fait que cette langue par défaut a pu aussi etre la langue précisée et que si rien n'est trouvé on renvoie la clé encore une fois).

    Pour l'instant je tatonne, car je découvre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ALTER FUNCTION dbo.TRADUCTION (@cle varchar(79))
    RETURNS varchar(79)
    AS
    BEGIN
         DECLARE @trad varchar(79)
         if @cle like('@LANGBDD%')
    	SET @trad = 'Yep'
    	ELSE
    		SET @trad = @cle
     
         RETURN(@trad)
    END
    GO
    Cette première version de ma fonction fonctionnait très bien.

    J'ai voulu ajouter une requete SQL à la place de retourner 'yep' et patatra...

    cela donne donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    BEGIN
         DECLARE @trad varchar(79)
         if @cle like('@LANGBDD%')
    	        Select value as trad from TRANSLATION where id= @cle and lang='en'
    	ELSE
    		SET @trad = @cle
     
         RETURN(@trad)
    END
    Je conçois ici que je n'ai pas mis la valeur traduite dans @trad parce que je ne sais pas comment faire.
    L'erreur qui m'est remontée doit venir de là : [Error Code: 444] La sélection d'instructions incluses dans une fonction ne peut pas renvoyer les données à un client.
    (via dbvisualizer)

    Auriez-vous une explication à me fournir concernant mon problème ?
    De même, l'un d'entre vous aurait-il une idée d'une facon de selectionner la valeur traduite dans la langue précisée si présente ou dans une autre langue ('en') sinon en une seule requete ? (Après il me faudra tester si il a bien retourné une valeur pour l'une ou l'autre langue..)

    Merci.
    Bonne journée.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,
    Citation Envoyé par samus35 Voir le message
    Je conçois ici que je n'ai pas mis la valeur traduite dans @trad parce que je ne sais pas comment faire.
    Vous pouvez affecter votre variable directement depuis la requête. Dans votre cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT @trad = value FROM TRANSLATION WHERE id= @cle AND lang='en'
    Citation Envoyé par samus35 Voir le message
    De même, l'un d'entre vous aurait-il une idée d'une facon de selectionner la valeur traduite dans la langue précisée si présente ou dans une autre langue ('en') sinon en une seule requete ? (Après il me faudra tester si il a bien retourné une valeur pour l'une ou l'autre langue..)
    Comment précisez vous la langue ?

    Si on considère qu'elle est contenue dans @lang, vous pouvez faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT TOP(1) @trad = value 
    FROM TRANSLATION 
    WHERE id= @cle 
        AND lang IN (@lang,'en')
    ORDER BY 
        CASE lang
            WHEN @lang THEN 0
            ELSE 1
        END

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2011
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 89
    Points : 109
    Points
    109
    Par défaut
    Excellent.
    Merci beaucoup cela m'aide énormément.

    Par contre auriez vous l’amabilité de m'expliquer un peu le case en fin de requête
    j'ai bien compris qu'il permet de "sélectionner" la langue précisée si elle a été trouvée, mais j'ai du mal à le comprendre en lui-même.

    Je cherche maintenant une dernière amélioration : Ai-je moyen de tester la nullité ?
    j'ai tenté après la requête quelques choses comme :
    if @trad = null
    @trad = @ cle juste après la requête mais cela n'a pas l'air de fonctionner
    (il y a l'air d'y avoir plusieurs fonctions comme ISNULL pour tester cela, sans résultat), afin de retourner la clé si aucune valeur n'a été trouvée.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par samus35 Voir le message
    Par contre auriez vous l’amabilité de m'expliquer un peu le case en fin de requête
    j'ai bien compris qu'il permet de "sélectionner" la langue précisée si elle a été trouvée, mais j'ai du mal à le comprendre en lui-même.
    Le case attribut la valeur 0 si lang = @lang, et 1 dans l'autres cas (ici, 'en').
    donc on aura les 0 en premier (lang = @lang) et les 1 ensuite. comme on ne prend que la première ligne, si une ligne vérifie la condition (lang = @lang) elle sera en premier.

    Citation Envoyé par samus35 Voir le message
    Je cherche maintenant une dernière amélioration : Ai-je moyen de tester la nullité ?
    j'ai tenté après la requête quelques choses comme :
    if @trad = null
    @trad = @ cle juste après la requête mais cela n'a pas l'air de fonctionner
    (il y a l'air d'y avoir plusieurs fonctions comme ISNULL pour tester cela, sans résultat), afin de retourner la clé si aucune valeur n'a été trouvée.
    if @trad = null ne sera jamais vrai, car null n'est égal a rien, même pas a null.

    pour tester si une valeur est a null, il faut faire IF @trad IS NULL.

    Vous pouvez aussi éviter le IF et utiliser directement la fonction COALESCE, qui renvoi la première valeur non nulle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SET @trad = COALESCE(@trad, @cle)

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2011
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Novembre 2011
    Messages : 89
    Points : 109
    Points
    109
    Par défaut
    Parfait. ^^
    Je vous remercie énormément (surtout pour l'explication), j'entrevoyais la choses mais pas assez clairement. C'est corrigé maintenant.

    Merci beaucoup.
    Bonne journée.

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

Discussions similaires

  1. Ajouter une fonction aux elements html
    Par the-destroyer dans le forum Général JavaScript
    Réponses: 16
    Dernier message: 30/06/2011, 08h53
  2. [XL-2000] recherche une fonction d'affichage particulier des colonnes
    Par pat91 dans le forum Excel
    Réponses: 20
    Dernier message: 24/05/2009, 00h45
  3. [Oracle 9.1] Types de retour d'une fonction PL/SQL
    Par ftrifiro dans le forum PL/SQL
    Réponses: 8
    Dernier message: 12/10/2005, 16h54
  4. retour de variable d'une fonction
    Par thunderblade dans le forum ASP
    Réponses: 4
    Dernier message: 28/04/2005, 13h27
  5. Retour NULL d'une fonction utilisateur
    Par tiboleo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 18/11/2004, 15h40

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