Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como fazer uma substituição aninhada de valores de outra tabela?


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