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 :

Problème avec if .. else if.. else dans une fonction


Sujet :

MS SQL Server

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 125
    Points : 90
    Points
    90
    Par défaut Problème avec if .. else if.. else dans une fonction
    Bonjour,

    Je suis débutante avec sql server et je voudrais créer la fonction suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    CREATE FUNCTION [dbo].[advcdSearch]
    (      
    @adress nvarchar(4000),
    @type nvarchar(4000),
    @desc nvarchar(4000)
    )
    RETURNS Table AS RETURN
    ( 
    if (@adress is not null and @type is not null and @desc is not null )
    begin
    SELECT dbo.Places.idPlace
    from dbo.Places,dbo.Description
    where(CONTAINS(dbo.Description.exactAdress,@adress) and CONTAINS(dbo.Description.specificDesc,@desc)
    and CONTAINS(dbo.Description.type,@type))
    and dbo.Places.idDesc=dbo.Description.idDesc
    end
     
    else if(@adress is not null and @type is not null and @desc is null)
    begin
    SELECT dbo.Places.idPlace
    from dbo.Places,dbo.Description
    where(CONTAINS(dbo.Description.exactAdress,@adress) and CONTAINS(dbo.Description.type,@type))
    and dbo.Places.idDesc=dbo.Description.idDesc
    end
     
    else if(@adress is  null and @type is not null and @desc is not null)
    begin
    SELECT dbo.Places.idPlace
    from dbo.Places,dbo.Description
    where(CONTAINS(dbo.Description.specificDesc,@desc)and CONTAINS(dbo.Description.type,@type))
    and dbo.Places.idDesc=dbo.Description.idDesc
    end
    else 
    begin
    Print 'aucun résultat'
    end
     )
    Mais le message d'erreur me s'affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Msg 156, Level 15, State 1, Procedure advcdSearch, Line 9
    Incorrect syntax near the keyword 'if'.
    Msg 102, Level 15, State 1, Procedure advcdSearch, Line 37
    Incorrect syntax near ')'.
    Malgrès que ce même bolc if..else if..else marche bien dans une procédure .

    je ne comprends pas d'où vient le problème

    Merci de m'aider

  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

    Vous n'avez pas besoin de tous ces branchements !
    Vous pouvez faire tout cela en une seule requete :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    CREATE FUNCTION [dbo].[advcdSearch]
    (      
    @adress nvarchar(4000),
    @type nvarchar(4000),
    @DESC nvarchar(4000)
    )
    RETURNS TABLE AS RETURN
    ( 
    SELECT dbo.Places.idPlace
    FROM dbo.Places
    INNER JOIN dbo.Description
        ON Places.idDesc=Description.idDesc
    WHERE
        (@adress IS NULL OR CONTAINS(dbo.Description.exactAdress,@adress)) 
    AND (@DESC IS NULL OR CONTAINS(dbo.Description.specificDesc,@DESC))
    AND (@type IS NULL OR CONTAINS(dbo.Description.type,@type))
    )

    En fait cette requête ne reflète pas exactement la logique de votre code car celui-ci ne traitait pas tous les cas... mais je pense qu'elle se rapproche plus de ce que vouliez faire : Filtrer sur les critères qui sont renseignés...

    (Par exemple dans votre code, si @adress est NULL, @type aussi mais pas @DESC, vous n'aurez aucun résultat car ce cas n'est pas traité )

    Si vous voulez garder cette logique, vous pouvez modifier la requête en suivant le même principe : inclure les vérifications sur les variables dans le filtre de la requête

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 125
    Points : 90
    Points
    90
    Par défaut
    Merci pour votre réponse mais la fonction que vous avez écrit retourne Null lorsque l'un des attributs @adress, @type ou @ desc est NULL.
    Alors que ce que je veux faire c'est retourner des valeurs une fois les trois valeurs ne sont pas null , ou bien si l'une des valeurs @desc ou @adress est null mais pas @type qui dois toujours avoir une valeur.

    je veux savoir pourquoi les if ne marchent pas au sein de la fonction alors que lorsque je mets le bloc if dans une procédure ça marche.

  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
    Donc comme je disais, vous pouvez modifier le fonctionnement, en gardant le principe.

    Dans votre cas, il faudra déjà sortir la vérification de nullité sur @Type de la parenthèse dans laquelle il se trouve, puisque vous voulez qu'il ne soit jamais null, et modifier les autres parties en fonction de votre besoin précis.

    pour ce qui est des IF, vous créez une fonction en ligne. Ce type de fonction accepte dans la clause RETURN uniquement une (et une seule) requête. Vous ne pouvez pas mettre des blocs d'instruction TSQL dans ce type de fonction comme vous le faites avec les IF
    Par contre, dans une requête, vous pouvez utiliser CASE, mais ici ce n'est pas nécessaire.

    Enfin si vous utilisez contains, assurez vous que les paramètres en entées de votre UDF soient bien formatés (avec les doubles quotes...)

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 125
    Points : 90
    Points
    90
    Par défaut
    J'ai trouvé sur le lien suivant une explication pour aire fonctionenr If dans une fonction et ça a fonctionné avec moi.
    je mets le lien pour ceux qui sont intéressés:
    http://social.msdn.microsoft.com/For...8-a264daf2d1b1

  6. #6
    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
    il est en effet tout à fait possible de mettre du TSQL dans une fonction... mais pas dans une fonction en ligne

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

Discussions similaires

  1. Problème avec le passage à la ligne dans une Textbox
    Par iFlo1 dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 22/03/2009, 13h47
  2. Problème avec la gestion des fichier dans une JList()
    Par chebmo1986 dans le forum Composants
    Réponses: 3
    Dernier message: 18/02/2009, 23h49
  3. Réponses: 3
    Dernier message: 07/05/2008, 13h30
  4. problème avec les sauts de ligne dans une string
    Par hexdoc dans le forum Langage
    Réponses: 6
    Dernier message: 02/05/2008, 15h28
  5. Problème avec ma méthode de recherche dans une JList
    Par Invité dans le forum Composants
    Réponses: 4
    Dernier message: 24/07/2007, 10h33

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