Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come effettuare una sostituzione nidificata di valori da un'altra tabella?

Disclaimer:la funzione è stata ridotta come promesso, aggiornerà la descrizione della risposta di conseguenza a tempo debito.

In base alla mia attuale comprensione del tuo problema, penso di poter applicare ad esso una funzione che ho progettato per risolvere un problema più complesso che ho avuto di recente. Potrebbero esserci altre soluzioni, ma sicuramente altri possono e le proporranno, quindi perché non ti offro qualcosa di un po' meno da offrire.

Attenzione, però, era pensato per affrontare qualcosa di più complesso del tuo (spiegato più avanti ), e in questo momento Purtroppo non ho tempo per dimagrire, ma ci arriverò probabilmente domani. Spero che i commenti aiutino. Indipendentemente da ciò, Ti riassumo l'obiettivo della mia funzione:

C'è una tabella che contiene quali messaggi trovare e con cosa sostituirli. La funzione riceverà un valore di testo come input, utilizzerà un cursore per eseguire il ciclo di detta tabella e per ogni record in detta tabella verificherà se il testo di input contiene qualcosa da sostituire e, se applicabile.

Due cose da notare sull'obiettivo originale. In primo luogo, esiste un ciclo nidificato per affrontare lo scenario in cui una determinata parola chiave esiste più volte, richiedendo quindi più sostituzioni. Secondo, Ho dovuto anche occuparmi di caratteri jolly, lunghezze variabili e se il flag di sostituzione è impostato o meno nella tabella discussa. Queste due cose più altre sono probabilmente la ragione per cui troverai un sacco di materiale strano che vola in giro.

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