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