Avis de non-responsabilité :la fonction a été simplifiée comme promis, la description de la réponse sera mise à jour en conséquence en temps voulu.
Selon ma compréhension actuelle de votre problème, je pense que je peux lui appliquer une fonction que j'ai conçue pour résoudre un problème plus complexe que j'ai eu récemment. Il pourrait y avoir d'autres solutions, mais très certainement d'autres peuvent et vont les proposer, alors pourquoi ne pas vous offrir quelque chose d'un peu moins à offrir.
Sachez cependant qu'il était destiné à traiter quelque chose de plus complexe que le vôtre (expliqué plus tard ), et maintenant Je n'ai malheureusement pas le temps de le réduire, mais j'y reviendrai probablement demain. J'espère que les commentaires vous aideront. Quoi qu'il en soit, je vais vous résumer l'objectif de ma fonction :
Il y a un tableau qui contient les messages à trouver et par quoi les remplacer. La fonction recevra une valeur de texte en entrée, utilisera un curseur pour boucler ladite table et pour chaque enregistrement de ladite table, elle vérifiera si le texte d'entrée contient quelque chose à remplacer et remplacera le cas échéant.
Deux choses à noter à propos de l'objectif initial. Tout d'abord, il y a une boucle imbriquée pour traiter le scénario où un certain mot-clé existe plusieurs fois, nécessitant donc plusieurs remplacements. Deuxièmement, J'ai également dû gérer les caractères génériques, les longueurs variables et déterminer si l'indicateur de remplacement est défini ou non dans le tableau discuté. Ces deux choses, plus d'autres, sont probablement la raison pour laquelle vous trouverez beaucoup de matériel étrange volant.
CREATE FUNCTION [JACKINABOX](@TextToUpdate varchar(30), @FilterId int)
RETURNS varchar(30) AS
BEGIN
DECLARE @Keyword varchar(30)
DECLARE LonelyCursor CURSOR FOR
SELECT Keyword FROM ReplacementInformation WHERE Id = @FilterId
OPEN LonelyCursor ; FETCH NEXT FROM LonelyCursor INTO @Keyword
WHILE @@FETCH_STATUS = 0 -- While there still remains keywords to process.
BEGIN
WHILE 1 = 1 -- Not sure, but I think this nested loop can be unlooped if [FETCH NEXT] was cut & pasted to replace [BREAK].
BEGIN
IF(CHARINDEX(@Keyword, @TextToUpdate) = 0)
BREAK -- If cannot find current keyword anymore, move on to next keyword.
ELSE -- Otherwise, update text then check again for same keyword.
SET @TextToUpdate = REPLACE(@TextToUpdate, @Keyword, CONCAT('Replaced_', @Keyword))
END
FETCH NEXT FROM LonelyCursor INTO @Keyword
END
CLOSE LonelyCursor ; DEALLOCATE LonelyCursor
RETURN @TextToUpdate
END