Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да направя вложена замяна на стойности от друга таблица?

Отказ от отговорност:Функцията е намалена, както беше обещано, ще актуализира съответно описанието на отговора своевременно.

Според сегашното ми разбиране за вашия проблем, мисля, че мога да приложа към него функция, която проектирах, за да реша по-сложен проблем, който имах наскоро. Може да има и други решения, но със сигурност други могат и ще ги предложат, така че защо не ви предложа нещо малко по-малко за предлагане.

Въпреки това имайте предвид, че е предназначено да адресира нещо по-сложно от вашето (обяснено по-късно ) и точно сега За съжаление нямам време да го отслабна, но вероятно ще се заема с това утре. Надявам се коментарите да помогнат. Независимо от това, ще обобщя целта на моята функция за вас:

Има таблица, която съдържа какви съобщения да намерите и с какво да ги замените. Функцията ще получи текстова стойност като вход, ще използва курсор, за да направи цикъл на споменатата таблица и за всеки запис в споменатата таблица ще провери дали въведеният текст съдържа нещо за замяна и ще замени, ако е приложимо.

Две неща, които трябва да отбележим относно първоначалната цел. Първо, има вложен цикъл за справяне със сценария, при който дадена ключова дума съществува няколко пъти, следователно изисква множество замествания. Второ, Трябваше да се справя и със заместващи символи, променливи дължини и дали флагът за заместване е зададен или не в обсъжданата таблица. Тези две неща плюс други вероятно са причината да намерите много странни материали, които летят наоколо.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SSIS ForEach цикъл - промяна на връзката вътре в for цикъл

  2. Запитване за криптирани стойности в база данни

  3. Транзакцията трябва да бъде прекратена, преди връзката да може да се използва за изпълнение на sql изрази

  4. Вземете списъка с уникални ограничения и индекси в база данни

  5. Йерархичен списък с типове тригерни събития в SQL Server 2019