Haftungsausschluss:Funktion wie versprochen abgespeckt, Antwortbeschreibung wird zu gegebener Zeit entsprechend aktualisiert.
Nach meinem derzeitigen Verständnis Ihres Problems denke ich, dass ich darauf eine Funktion anwenden kann, die ich entwickelt habe, um ein komplexeres Problem zu lösen, das ich kürzlich hatte. Es könnte andere Lösungen geben, aber sicherlich können und werden andere sie vorschlagen, also warum biete ich Ihnen nicht etwas weniger an, das angeboten werden kann.
Beachten Sie jedoch, dass es um etwas Komplexeres als Ihres gehen sollte (später erklärt ) und jetzt Leider habe ich keine Zeit zum Abnehmen, aber dazu komme ich wahrscheinlich morgen. Ich hoffe die Kommentare helfen. Ungeachtet dessen fasse ich das Ziel meiner Funktion für Sie zusammen:
Es gibt eine Tabelle, die enthält, welche Nachrichten zu finden sind und wodurch sie ersetzt werden. Die Funktion erhält einen Textwert als Eingabe, verwendet einen Cursor, um die Tabelle zu durchlaufen, und prüft für jeden Datensatz in der Tabelle, ob der Eingabetext etwas zu ersetzendes enthält, und ersetzt es gegebenenfalls.
Zwei Dinge, die über das ursprüngliche Ziel zu beachten sind. Erstens Es gibt eine verschachtelte Schleife, um das Szenario zu adressieren, in dem ein bestimmtes Schlüsselwort mehrmals vorhanden ist und daher mehrere Ersetzungen erfordert. Zweitens Ich musste mich auch mit Platzhaltern, variablen Längen und der Frage befassen, ob das Ersatz-Flag in der besprochenen Tabelle gesetzt ist oder nicht. Diese beiden Dinge und noch mehr sind wahrscheinlich der Grund, warum Sie eine Menge seltsames Material finden, das herumfliegt.
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