Я сейчас работаю над этим проектом.
Моя проблема: в таблице 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)