Как заменить () несколько @var на одном полюсе текстом из другого столбца таблицы? - PullRequest
0 голосов
/ 27 марта 2020

Я сейчас работаю над этим проектом.

Моя проблема: в таблице 1 я вижу столбец DynamicField с большим количеством @var. Т.е.

@var=textofvar;@var2=textext 

и т. Д.

Что мне нужно сделать, это найти =text и заменить (не обновлять) каждый @var Я найду в таблице 2 столбец MailSubject с ним.

Моя текущая проблема (исключая стиль кода и оптимизацию) заключается в том, что когда я использую курсор, как вы можете видеть ниже, только один @var изменяется в атм, а в следующей строке первая @var по-прежнему не заменяется только второй раз.

Что я делаю не так? Из c я могу сделать это с помощью функции проще (я уже сделал так, код функции будет ниже), но на этот раз я чувствую необходимость сделать это с помощью курсора, если это вообще возможно.

Текущий код:

SELECT 
    t.id,
    SUBSTRING(t.items, 1 , CHARINDEX('=',t.items)-1) as zmienna,
    SUBSTRING(t.items,  CHARINDEX('=',t.items)+1, LEN(t.items)) as wartosc    
INTO 
    #temp 
FROM 
    (SELECT id, items 
     FROM MailSendingEvents
     CROSS APPLY dbo.split(DynamicField, ';')) t 

DECLARE @id int
DECLARE @zmienna nvarchar(100)
DECLARE @wartosc nvarchar(max)

DECLARE cursor_replace CURSOR FOR 
     SELECT
         id, zmienna, wartosc
     FROM
         #temp

OPEN cursor_replace
FETCH NEXT FROM cursor_replace INTO @id, @zmienna, @wartosc

WHILE @@FETCH_STATUS = 0
BEGIN
    DECLARE @replace nvarchar(max)

    IF EXISTS(SELECT * FROM MailEventTypes 
              WHERE MailSubject LIKE '%' + @zmienna + '%')
        SELECT REPLACE(t.MailSubject,@zmienna, @wartosc) AS MailSubject
        FROM MailEventTypes t
        INNER JOIN MailSendingEvents e ON e.ID_MailEventTypes = t.Id 
        WHERE e.id = @id

    FETCH NEXT FROM cursor_replace INTO @id, @zmienna, @wartosc
END;

CLOSE cursor_replace
DEALLOCATE cursor_replace
DROP TABLE #temp

Решается с помощью этой функции:

ALTER FUNCTION dbo.textreplace 
    (@tresc nvarchar(max), @zmienne nvarchar(max))
RETURNS nvarchar(max) AS
BEGIN
    IF @zmienne NOT LIKE '%@%'
        RETURN @tresc

    WHILE CHARINDEX('@', @tresc) > 0 AND LEN(@zmienne) > 0 
    BEGIN
        DECLARE @varstart int = CHARINDEX('@', @zmienne)
        DECLARE @varend int = CHARINDEX(';', @zmienne)
        DECLARE @vardiff int = CHARINDEX('=', @zmienne)                 

        DECLARE @varname nvarchar(max) = SUBSTRING(@zmienne, @varstart, @vardiff - @varstart)
        DECLARE @vartext nvarchar(max) = SUBSTRING(@zmienne, @vardiff+1, @varend - @vardiff - 1)        
        DECLARE @varall nvarchar(max) = SUBSTRING(@zmienne, CHARINDEX('@', @zmienne), CHARINDEX(';', @zmienne))     

        SET @tresc = REPLACE(@tresc, @varname, @vartext) 
        --print @tresc
        SET @zmienne = REPLACE(@zmienne, @varall, '')
    END

    RETURN @tresc
END

SELECT dbo.textreplace(t.mailsubject, e.DynamicField)
...