sql >> Databasteknik >  >> RDS >> Sqlserver

Hur gör man en kapslad ersättning av värden från en annan tabell?

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



  1. Icke engelska tecken visas som frågetecken på min php-sida - visas bra i databasen

  2. MySQL versionskontroll - Subversion

  3. PostgreSQL partiellt unikt index och upsert

  4. Tillkännage ClusterControl 1.4.1 - ProxySQL Edition