Редактирование XML из SQL-запросов с использованием XML-DML - PullRequest
1 голос
/ 13 апреля 2011

В моей базе данных MSSQL есть столбец XML, схема которого выглядит примерно так:

<Form>
   <Version>1000</Version>
   <OtherValues />
</Form>

И мне нужно вручную (с помощью скрипта) изменить число всех строк Version на 1001. После поискаЯ могу заключить, что я собираюсь использовать функцию .modify XPath, но все примеры, которые я нашел, были для вставки узлов, а не их редактирования.

Может кто-то пролить свет на то, как это сделать?это?

1 Ответ

5 голосов
/ 13 апреля 2011

Пример настройки данных:

DECLARE @t TABLE (
    Id int
    , X xml
)

INSERT @t VALUES ( 1, '
<Form>
   <Version>1000</Version>
   <OtherValues />
</Form>
'
)

INSERT @t VALUES ( 2, '
<Form>
   <Version>1000</Version>
   <OtherValues />
</Form>
'
)

Данные перед изменением:

SELECT * FROM @t

Id          X
----------- ------------------------------------------------------------
1           <Form><Version>1000</Version><OtherValues /></Form>
2           <Form><Version>1000</Version><OtherValues /></Form>

Обновление данных :

UPDATE @t
SET X.modify('
replace value of 
    (/Form/Version[.="1000"]/text())[1]
with
    "1001"
')

Данные после изменения:

SELECT * FROM @t

Id          X
----------- ------------------------------------------------------------
1           <Form><Version>1001</Version><OtherValues /></Form>
2           <Form><Version>1001</Version><OtherValues /></Form>

Что следует отметить:

  • replace value of требует, чтобы выражение «подлежащее замене» идентифицировало «статический синглтон», т. Е. синтаксический анализатор должен иметь возможность определить, что он относится к одиночному значение - отсюда [1]
  • Только один узел (на строку) когда-либо будет изменен на .modify! Так что если у вас есть несколько узлов XML в одной строке, вам придется выполнять итерацию вручную
...