sql >> Database >  >> RDS >> Sqlserver

Hoe maak je een geneste vervanging van waarden uit een andere tabel?

Disclaimer:Functie afgeslankt zoals beloofd, zal de antwoordbeschrijving te zijner tijd dienovereenkomstig bijwerken.

Op basis van mijn huidige begrip van uw probleem, denk ik dat ik er een functie op kan toepassen die ik heb ontworpen om een ​​complexer probleem op te lossen dat ik onlangs had. Er zijn misschien andere oplossingen, maar anderen kunnen en zullen ze zeker voorstellen, dus waarom bied ik je niet iets minder aan.

Houd er echter rekening mee, het was bedoeld om iets ingewikkelder dan het uwe aan te pakken (later uitgelegd ), en nu Ik heb helaas geen tijd om het af te slanken, maar daar kom ik waarschijnlijk morgen op terug. Ik hoop dat de opmerkingen helpen. Hoe dan ook, Ik zal het doel van mijn functie voor je samenvatten:

Er is een tabel die bevat welke berichten u kunt vinden en waarmee u ze kunt vervangen. De functie zal een tekstwaarde als invoer ontvangen, zal een cursor gebruiken om genoemde tabel te herhalen, en voor elk record in genoemde tabel zal het controleren of invoertekst iets bevat om te vervangen, en vervangen indien van toepassing.

Twee dingen om op te merken over het oorspronkelijke doel. Eerst, er is een geneste lus om het scenario aan te pakken waarin een bepaald trefwoord meerdere keren voorkomt, waardoor meerdere vervangingen nodig zijn. Ten tweede, Ik had ook te maken met wildcards, variabele lengtes en of de vervangende vlag al dan niet is ingesteld in de besproken tabel. Deze twee dingen plus andere zijn waarschijnlijk de reden dat je veel raar materiaal zult zien rondvliegen.

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. Datum valideren in Oracle zonder functie te gebruiken

  2. Hoe een mysql-database bijwerken via sms-berichten?

  3. Simuleren group_concat MySQL-functie in Microsoft SQL Server 2005?

  4. wamp / php-fout Fatale fout:Klasse 'mysqli_connect' niet gevonden in C:\wamp\www\finalproject\Connections\Main_DB.php op regel 9