sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo hacer un reemplazo anidado de valores de otra tabla?

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