Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie kann man Werte aus einer anderen Tabelle verschachtelt ersetzen?

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