Заменить значение в XML с помощью SQL - PullRequest
0 голосов
/ 13 мая 2018

Мне нужно заменить значение в xml с помощью SQL, здесь я сталкиваюсь с проблемой, которую я хочу заменить, это значение, которое я хочу заменить не на конкретный xpath, одно и то же значение на разных узлах и xpath также отличается, поэтому в основном я хочу найти и заменить значение.

пример:

<data>
  <policy>
    <Effectivedate>2018-04-05</Effectivedate>
    <TermStartDate>2018-04-05</TermStartDate>
    <Line>
        <Risk>
            <Coverage>
                <Type>1</Type>
                <coverstartdate>2018-04-05</coverstartdate>
            </Coverage>
            <Coverage>
                <Type>2</Type>
                <coverstartdate>2018-04-05</coverstartdate>
            </Coverage>
            <Coverage>
                <Type>3</Type>
                <coverstartdate>2018-04-05</coverstartdate>
            </Coverage>
        </Risk>
    </Line>
  </policy>
 </data>

В приведенном выше примере мне нужно заменить дату 2018-04-05 на 2018-04-06

Пожалуйста, кто-нибудь может помочь здесь.

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Функция .modify() не позволит вам изменить более одного значения за вызов.Вы можете сделать это на уровне строки с REPLACE(), но это может иметь побочные эффекты ...

Что вы можете сделать (но это не будет быстро), это использовать .modify() в цикле,пока все случаи не будут заменены, что-то вроде этого:

DECLARE  @xml XML=
N'<data>
  <policy>
    <Effectivedate>2018-04-05</Effectivedate>
    <TermStartDate>2018-04-05</TermStartDate>
    <Line>
        <Risk>
            <Coverage>
                <Type>1</Type>
                <coverstartdate>2018-04-05</coverstartdate>
            </Coverage>
            <Coverage>
                <Type>2</Type>
                <coverstartdate>2018-04-05</coverstartdate>
            </Coverage>
            <Coverage>
                <Type>3</Type>
                <coverstartdate>2018-04-05</coverstartdate>
            </Coverage>
        </Risk>
    </Line>
  </policy>
 </data>';

WHILE @xml.exist(N'//*[text()="2018-04-05"]')=1
BEGIN
    SET @xml.modify(N'replace value of (//*[text()="2018-04-05"]/text())[1] with "2018-04-06"');
END
SELECT @xml;

Это уродливо (из-за цикла) и медленно, но - по крайней мере - это XQuery.

0 голосов
/ 13 мая 2018

Если вам нужно заменить элементы в разных путях, вы можете привести xml к *char и использовать replace:

declare @xml xml='<data> <policy> <Effectivedate>2018-04-05</Effectivedate> <TermStartDate>2018-04-05</TermStartDate> <Line> <Risk> <Coverage> <Type>1</Type> <coverstartdate>2018-04-05</coverstartdate> </Coverage> <Coverage> <Type>2</Type> <coverstartdate>2018-04-05</coverstartdate> </Coverage> <Coverage> <Type>3</Type> <coverstartdate>2018-04-05</coverstartdate> </Coverage> </Risk> </Line> </policy> </data>'

select cast (replace (cast(@xml as nvarchar(max)), '2018-04-05','2018-04-06') as xml)

Результат:

enter image description here

...