Traitement de sous fonction dans une fonction ou procedure

cs_breton51 Messages postés 78 Date d'inscription jeudi 21 avril 2005 Statut Membre Dernière intervention 15 novembre 2018 - 13 nov. 2018 à 11:46
jordane45 Messages postés 38169 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 8 mai 2024 - 15 nov. 2018 à 14:32
Bonjour,

Pouvez-vous me dire si tous les thermes a l’intérieur d'une fonction sont évaluer avant sont traitement:

FUNCTION [dbo].[fonc]
(
	@ID_UO_LIST VARCHAR(MAX),
	@SEPARATEUR CHAR(1)
)
RETURNS TABLE
AS
SELECT * FROM MaTable As ta
		WHERE

	(
		(
			CHARINDEX(@SEPARATEUR,@ID_UO_LIST) = 0
		) 
		AND 
		(
			ta.val = @ID_UO_LIST
		)
	)
	OR
	(
		(
			CHARINDEX(@SEPARATEUR,@ID_UO_LIST) > 0
		) 
		AND 
		(
			ta.val IN (select * from FN_SPLIT_TO_TABLE( @ID_UO_LIST,@SEPARATEUR))
		)
	)


le problème c'est que lorsque je fait appel a cette fonction depuis une procedure avec comme param:
@SEPARATEUR=','
@ID_UO_LIST='123'
pas d'erreur mais j'ai l'impression que FN_SPLIT_TO_TABLE est quand même évalué alors la condition pour son évaluation n'est pas réuni.

même appel avec les param:
@SEPARATEUR=','
@ID_UO_LIST='123,123'
j'ai une lever d'erreur impossible de convertir 123,132 en int ce qui pour mois doit provenir de ta.val = @ID_UO_LIST mais normalement cette condition ne devrait pas etre évalué

pouvez-vous me confirmé ce fonctionnement et comment implémenter cette fonction sans erreur
--

5 réponses

jordane45 Messages postés 38169 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 8 mai 2024 344
13 nov. 2018 à 12:29
Bonjour,

Toutes les conditions sont "évaluées" afin de savoir si, justement, elles doivent être prise en compte ou non dans le traitement.

Les AND / OR ... ne sont pas des "IF / ELSE"

0
cs_breton51 Messages postés 78 Date d'inscription jeudi 21 avril 2005 Statut Membre Dernière intervention 15 novembre 2018
13 nov. 2018 à 14:16
merci pour ton retour,

Je complète
Existe t'il un paramétrage de la fonction pour n'évaluer la condition suivante que si la condition préalable est validé.

en gros faire sa:
WHERE
       A AND B



ne pas évaluer B vue que A est faux en gros faire un ANDALSO
pas sous cette forme mais dans une forme?


--
0
jordane45 Messages postés 38169 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 8 mai 2024 344
13 nov. 2018 à 14:24
Je t'ai donné la réponse...... IF / ELSE
0
cs_breton51 Messages postés 78 Date d'inscription jeudi 21 avril 2005 Statut Membre Dernière intervention 15 novembre 2018
13 nov. 2018 à 14:30
Merci,

comment je peut utiliser un IF / ELSE dans

FUNCTION [dbo].[fonc]
(
	@ID_UO_LIST VARCHAR(MAX),
	@SEPARATEUR CHAR(1)
)
RETURNS TABLE
AS
SELECT * FROM MaTable As ta
		WHERE
IF


j'ai une erreur quand je veux mètre une condition dans la close WHERE
Existe t'il un moyen de contourné
--
0
jordane45 Messages postés 38169 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 8 mai 2024 344
13 nov. 2018 à 14:43
Déjà...ça dépend de l'erreur...
Et ensuite... ça dépend de ce que tu as écrit !
Si tu as juste marqué "IF" .... normal que ça ne fonctionne pas.....

https://www.google.fr/search?q=SQL+IF
0
jordane45 Messages postés 38169 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 8 mai 2024 344
13 nov. 2018 à 14:47
Et si le IF ne fonctionne pas (ça dépend du SGBD que tu utilises....), tournes toi vers un CASE
https://sql.sh/cours/case
0
cs_breton51 Messages postés 78 Date d'inscription jeudi 21 avril 2005 Statut Membre Dernière intervention 15 novembre 2018
13 nov. 2018 à 15:00
Pour l'erreur j'ai:
Échec de la conversion de la valeur varchar '123,123' en type de données int.

En entrer j'ai valoriser @ID_UO_LIST = '123,132'
j’essaie d'affecter @ID_UO_LIST à ta.val qui est un int ce qui me déclenche cette erreur

pour le IF
FUNCTION [dbo].[fonc]
(
	@ID_UO_LIST VARCHAR(MAX),
	@SEPARATEUR CHAR(1)
)
RETURNS TABLE
AS
SELECT * FROM MaTable As ta
	WHERE
		IF (CHARINDEX(@ID_UO_LIST,',') > 0 
			ta.val = @ID_UO_LIST
		ELSE
			ta.val IN (select * from FN_SPLIT_TO_TABLE( @ID_UO_LIST,@SEPARATEUR))
0
cs_breton51 Messages postés 78 Date d'inscription jeudi 21 avril 2005 Statut Membre Dernière intervention 15 novembre 2018
13 nov. 2018 à 15:01
oups
IF (CHARINDEX(@ID_UO_LIST,',') > 0 au lien de
IF (CHARINDEX(@ID_UO_LIST,',') = 0

impossible de compiler
0
jordane45 Messages postés 38169 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 8 mai 2024 344
13 nov. 2018 à 15:20
0
cs_breton51 Messages postés 78 Date d'inscription jeudi 21 avril 2005 Statut Membre Dernière intervention 15 novembre 2018
14 nov. 2018 à 09:14
merci jordane45,
oui j'ai bien lu la doc avant de posté et j'avais bien indiquer le type pour la conversion sur mon test, je l'avait juste pas remis dans mon poste précédant.
le problème c'est que 123,123 n'est pas un int. et il ne le serait encore moins si je passe plus de paramètre '123,124,125,152' du coup j'aurais obligatoirement l'erreur de générer.

A tu une autre piste ou peut être que ce que je veux faire est impossible en T-SQL

--
0
jordane45 Messages postés 38169 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 8 mai 2024 344
14 nov. 2018 à 12:22
Par contre.. je viens de "comprendre" à quoi correspond ta variable...
et donc.. pourquoi vouloir faire :
if CHARINDEX(@SEPARATEUR,@ID_UO_LIST) = 0
		return @NUM_VAR + '=' + @ID_UO_LIST
	else
		return @NUM_VAR + 'IN (' + @ID_UO_LIST + ')'
END

Alors que plus simplement
return @NUM_VAR + 'IN (' + @ID_UO_LIST + ')'

devrait fonctionner que tu aies UNE ou PLUSIEURS valeurs
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_breton51 Messages postés 78 Date d'inscription jeudi 21 avril 2005 Statut Membre Dernière intervention 15 novembre 2018
15 nov. 2018 à 14:01
bonjour,

Merci pour votre temps.
En fait je ne crois pas que ce que je veux faire est possible.
le IF ELSE est impossible dans le corps d'une close WHERE d'une fonction.
la transcription a la volé d'une chaine vers une close est aussi impossible seul le traitement complet d'une requête est possible en string via EXEC @ma_req
je vais donc attendre le passage a la dernière version de T-SQL qui embarque une méthode SPLIT.

merci tout de même si vous voyer une autre façon de faire je reste preneur.
Cordialement.


--
0
jordane45 Messages postés 38169 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 8 mai 2024 344
15 nov. 2018 à 14:32
Par contre, comme je te l'ai indiqué dans une précédente réponse :

Et si le IF ne fonctionne pas (ça dépend du SGBD que tu utilises....), tournes toi vers un CASE
https://sql.sh/cours/case
0
Rejoignez-nous