Isenção de responsabilidade:função reduzida conforme prometido, atualizará a descrição da resposta de acordo no devido tempo.
De acordo com meu entendimento atual do seu problema, acho que posso aplicar a ele uma função que projetei para resolver um problema mais complexo que tive recentemente. Pode haver outras soluções, mas certamente outros podem e irão propô-las, então por que não ofereço a você algo um pouco menos a ser oferecido.
Esteja ciente, porém, de que foi feito para abordar algo mais complexo que o seu (explicado mais tarde ) e agora Infelizmente não tenho tempo para emagrecer, mas provavelmente chegarei a isso amanhã. Espero que os comentários ajudem. Independentemente disso, Vou resumir o objetivo da minha função para você:
Há uma tabela que contém quais mensagens localizar e com o que substituí-las. A função receberá um valor de texto como entrada, usará um cursor para fazer um loop na referida tabela e, para cada registro na referida tabela, verificará se o texto de entrada contém algo para substituir e substituir, se aplicável.
Duas coisas a serem observadas sobre o objetivo original. Primeiro, há um loop aninhado para abordar o cenário em que uma determinada palavra-chave existe várias vezes, exigindo várias substituições. Segundo, Eu também tive que lidar com curingas, comprimentos variáveis e se o sinalizador de substituição está ou não definido na tabela discutida. Essas duas coisas mais outras são provavelmente a razão pela qual você encontrará muito material estranho voando por aí.
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