Descargo de responsabilidad:la función se redujo según lo prometido, actualizará la descripción de la respuesta en consecuencia a su debido tiempo.
Según mi comprensión actual de su problema, creo que puedo aplicarle una función que diseñé para resolver un problema más complejo que tuve recientemente. Puede haber otras soluciones, pero seguramente otros pueden y las propondrán, así que ¿por qué no te ofrezco algo un poco menos que ofrecer?
Sin embargo, tenga en cuenta que estaba destinado a abordar algo más complejo que el suyo (explicado más adelante ), y ahora mismo Lamentablemente, no tengo tiempo para adelgazar, pero lo haré probablemente mañana. Espero que los comentarios ayuden. De todos modos, resumiré el objetivo de mi función para usted:
Hay una tabla que contiene qué mensajes buscar y con qué reemplazarlos. La función recibirá un valor de texto como entrada, usará un cursor para recorrer dicha tabla y para cada registro en dicha tabla verificará si el texto de entrada contiene algo para reemplazar y reemplazar si corresponde.
Dos cosas a tener en cuenta sobre el objetivo original. Primero, hay un bucle anidado para abordar el escenario en el que una determinada palabra clave existe varias veces, por lo que requiere varios reemplazos. Segundo, También tuve que lidiar con comodines, longitudes variables y si la bandera de reemplazo está configurada o no en la tabla discutida. Estas dos cosas, además de otras, son probablemente la razón por la que encontrará un montón de material extraño volando por ahí.
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