Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/04/2011, 16h14   #1
Membre du Club
 
marwa .net
Inscription : décembre 2009
Messages : 126
Détails du profil
Informations personnelles :
Nom : marwa .net
Localisation : Tunisie

Informations forums :
Inscription : décembre 2009
Messages : 126
Points : 53
Points : 53
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 :
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 :
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
marwa21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 17h27   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

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

Code sql :
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
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 18h04   #3
Membre du Club
 
marwa .net
Inscription : décembre 2009
Messages : 126
Détails du profil
Informations personnelles :
Nom : marwa .net
Localisation : Tunisie

Informations forums :
Inscription : décembre 2009
Messages : 126
Points : 53
Points : 53
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.
marwa21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 18h20   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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...)
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 10h17   #5
Membre du Club
 
marwa .net
Inscription : décembre 2009
Messages : 126
Détails du profil
Informations personnelles :
Nom : marwa .net
Localisation : Tunisie

Informations forums :
Inscription : décembre 2009
Messages : 126
Points : 53
Points : 53
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
marwa21 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 10h37   #6
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
il est en effet tout à fait possible de mettre du TSQL dans une fonction... mais pas dans une fonction en ligne
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h24.


 
 
 
 
Partenaires

Hébergement Web