Je n'arrive pas à optimiser ma fonction

cs_oluha Messages postés 71 Date d'inscription vendredi 19 mars 2004 Statut Membre Dernière intervention 5 février 2009 - 2 juin 2005 à 12:27
cs_moustachu Messages postés 1079 Date d'inscription jeudi 14 novembre 2002 Statut Membre Dernière intervention 1 janvier 2012 - 13 juin 2005 à 14:22
Bonjour


Je cherche à faire une fonction qui prend en entrée une chaine et renvoie cette même chaine avec les abréviations corrigées. J'ai une table "Abreviations" qui contient toutes les abréviations autorisée par la norme et les mots auxquelles elles correspondent.
J'ai fais la fonction suivante mais quand je l'appelle dans ma procédure stockée, elle rallonge considérablement le temps d'execution et j'aimerai donc pouvoir l'optimiser mais je ne vois pas trop comment :(

CREATE Function F_TITRESRUE (@ENTREE varchar(50))
returns varchar(50)
as
begin
declare @S varchar(50)
declare @TMP varchar(50)
declare @MOT varchar(50)
declare @ABREV varchar(50)
declare @NBMOT int
declare @I int


set @NBMOT = (select presse.dbo.F_COMPTEMOTS(@ENTREE))
set @I = 1
set @TMP = @ENTREE
set @S = @ENTREE


while @I <= @NBMOT
begin
set @MOT = ltrim(rtrim(left(@TMP, CHARINDEX(' ', @TMP))))
if @MOT in (select ABREVIATION from Abreviations)
begin set @ABREV (select MOT from Abreviations where ABREVIATION @MOT and ORDREABREV = 1)
set @S = rtrim(ltrim(replace(' [mailto:'+@S+' '+@S+'] ', ' [mailto:'+@MOT+' '+@MOT+'] ', ' [mailto:'+@ABREV+' '+@ABREV+'] ')))
end
set @TMP = ltrim(rtrim(right(@TMP, (len(@TMP) - len(@MOT)))))
set @I = @I + 1
end


return rtrim(ltrim(@S))


end

Quelqu'un aurait une idée ?

Merci

1 réponse

cs_moustachu Messages postés 1079 Date d'inscription jeudi 14 novembre 2002 Statut Membre Dernière intervention 1 janvier 2012
13 juin 2005 à 14:22
J'espère pouvoir t'aider un peu :

- Je suis loin de tout connaître en TSQL mais n'existe-t-il pas une fonction trim ?

- As-tu créé un index sur ABREVIATION de ta table Abreviations ?
- if @MOT in (select ABREVIATION from Abreviations). Tu
fais cette requête à chaque boucle, à chaque fois, tu demande
l'ensemble de la table abreviations. Peut être faire un truc du genre
(select @nb=count(ABREVIATION) from Abreviations where ABREVIATION=@MOT) ensuite tu testes le @nb

- Ou même, plus directement après ton set @ABREV (select MOT from Abreviations where ABREVIATION @MOT and ORDREABREV = 1), tu testes si @ABREV n'est pas '' ou null (je ne sais pas ce que tu obtiendras)







++
Moustachu
0
Rejoignez-nous