Ansvarsfriskrivning:Funktionen har bantats ner som utlovat, kommer att uppdatera svarsbeskrivningen i enlighet med detta i god tid.
Enligt min nuvarande förståelse av ditt problem tror jag att jag kan använda en funktion som jag designat för att lösa ett mer komplext problem som jag hade nyligen. Det kan finnas andra lösningar, men säkert kan och kommer andra att föreslå dem, så varför kan jag inte erbjuda dig något mindre att erbjuda.
Tänk dock på att det var tänkt att ta itu med något mer komplext än ditt (förklaras senare ), och just nu Jag har tyvärr inte tid att banta det, men det kommer jag nog till imorgon. Jag hoppas att kommentarerna hjälper. Oavsett vilket, jag ska sammanfatta min funktions mål för dig:
Det finns en tabell som innehåller vilka meddelanden som ska hittas och vad de ska ersättas med. Funktionen kommer att ta emot ett textvärde som inmatning, kommer att använda en markör för att loopa nämnda tabell, och för varje post i nämnda tabell kommer den att kontrollera om inmatad text innehåller något att ersätta, och ersätta om tillämpligt.
Två saker att notera om det ursprungliga målet. Först, det finns en kapslad loop för att hantera scenariot där ett visst nyckelord existerar flera gånger, vilket kräver flera ersättningar. Andra, Jag var också tvungen att hantera jokertecken, variabla längder och huruvida ersättningsflaggan är satt i den diskuterade tabellen. Dessa två saker plus andra är förmodligen anledningen till att du hittar massor av konstigt material som flyger omkring.
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