Traitement de sous fonction dans une fonction ou procedure

Messages postés
78
Date d'inscription
jeudi 21 avril 2005
Dernière intervention
15 novembre 2018
- - Dernière réponse : jordane45
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
- 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
--
Afficher la suite 

Votre réponse

5 réponses

Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
0
Merci
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"

Commenter la réponse de jordane45
Messages postés
78
Date d'inscription
jeudi 21 avril 2005
Dernière intervention
15 novembre 2018
0
Merci
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?


--
jordane45
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
-
Je t'ai donné la réponse...... IF / ELSE
Commenter la réponse de cs_breton51
Messages postés
78
Date d'inscription
jeudi 21 avril 2005
Dernière intervention
15 novembre 2018
0
Merci
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é
--
cs_breton51
Messages postés
78
Date d'inscription
jeudi 21 avril 2005
Dernière intervention
15 novembre 2018
-
oups
IF (CHARINDEX(@ID_UO_LIST,',') > 0 au lien de
IF (CHARINDEX(@ID_UO_LIST,',') = 0

impossible de compiler
jordane45
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
-
cs_breton51
Messages postés
78
Date d'inscription
jeudi 21 avril 2005
Dernière intervention
15 novembre 2018
-
Merci pour ton retour mais j'ai une erreur si je veux faire un CAST('123,123')
Échec de la conversion de la valeur varchar '123,123' en type de données int.
jordane45
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
> cs_breton51
Messages postés
78
Date d'inscription
jeudi 21 avril 2005
Dernière intervention
15 novembre 2018
-
As tu lu la doc ?
SELECT CAST( expression AS type );

Normalement,
CAST( @ID_UO_LIST AS SIGNED INTEGER )
cs_breton51
Messages postés
78
Date d'inscription
jeudi 21 avril 2005
Dernière intervention
15 novembre 2018
-
une possibilité serait d'écrire une partie de la fonction en string qui serai compiler au moment de l’exécution
ex:
SELECT * FROM MaTable As ta
	WHERE
TransformToText('ta.val', @ID_UO_LIST, @SEPARATEUR)


puis

ALTER FUNCTION [dbo].[TransformToText]
(
	@NUM_VAR VARCHAR(MAX),
	@ID_UO_LIST VARCHAR(MAX),
	@SEPARATEUR CHAR(1)
)

RETURNS VARCHAR(100)
BEGIN
	if CHARINDEX(@SEPARATEUR,@ID_UO_LIST) = 0
		return @NUM_VAR + '=' + @ID_UO_LIST
	else
		return @NUM_VAR + 'IN (' + @ID_UO_LIST + ')'
END



cette solution est elle fonctionnel?
Commenter la réponse de cs_breton51
Messages postés
78
Date d'inscription
jeudi 21 avril 2005
Dernière intervention
15 novembre 2018
0
Merci
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

--
jordane45
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
-
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
Commenter la réponse de cs_breton51
Messages postés
78
Date d'inscription
jeudi 21 avril 2005
Dernière intervention
15 novembre 2018
0
Merci
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.


--
jordane45
Messages postés
23610
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
14 décembre 2018
-
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
Commenter la réponse de cs_breton51

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.