Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment faire un remplacement imbriqué des valeurs d'une autre table ?

Avis de non-responsabilité :la fonction a été simplifiée comme promis, la description de la réponse sera mise à jour en conséquence en temps voulu.

Selon ma compréhension actuelle de votre problème, je pense que je peux lui appliquer une fonction que j'ai conçue pour résoudre un problème plus complexe que j'ai eu récemment. Il pourrait y avoir d'autres solutions, mais très certainement d'autres peuvent et vont les proposer, alors pourquoi ne pas vous offrir quelque chose d'un peu moins à offrir.

Sachez cependant qu'il était destiné à traiter quelque chose de plus complexe que le vôtre (expliqué plus tard ), et maintenant Je n'ai malheureusement pas le temps de le réduire, mais j'y reviendrai probablement demain. J'espère que les commentaires vous aideront. Quoi qu'il en soit, je vais vous résumer l'objectif de ma fonction :

Il y a un tableau qui contient les messages à trouver et par quoi les remplacer. La fonction recevra une valeur de texte en entrée, utilisera un curseur pour boucler ladite table et pour chaque enregistrement de ladite table, elle vérifiera si le texte d'entrée contient quelque chose à remplacer et remplacera le cas échéant.

Deux choses à noter à propos de l'objectif initial. Tout d'abord, il y a une boucle imbriquée pour traiter le scénario où un certain mot-clé existe plusieurs fois, nécessitant donc plusieurs remplacements. Deuxièmement, J'ai également dû gérer les caractères génériques, les longueurs variables et déterminer si l'indicateur de remplacement est défini ou non dans le tableau discuté. Ces deux choses, plus d'autres, sont probablement la raison pour laquelle vous trouverez beaucoup de matériel étrange volant.

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