Использование Xquery для замены значения узла xsi: nil = "true" - PullRequest
2 голосов
/ 15 декабря 2010

Я пытаюсь использовать XQuery в SQL Server 2005 для обновления xml, сохраненного в столбце.Вот пример данных, которые мне нужно обновить.

<Length>3</Length>
<Width>5</Width>
<Depth>6</Depth>
<Area xsi:nil="true" />
<Volume xsi:nil="true" />

Мне нужно установить площадь и объем в значения из другой таблицы.Я создаю CTE для обновления.Есть другая логика, которую я пропустил, но я убедился, что CTE содержит правильные данные для обновления:

;with Volume (DocumentID, Volume) As
(
  Select DocumentID, Volume from tbl
)

, и я использую следующую инструкцию SQL XQuery, чтобы попытаться обновить таблицу.

UPDATE tbl_Archive
   SET XML.modify(' declare namespace x="http://www.redacted.com";
   replace value of  (/x:Document/x:Volume/text())[1]
   with sql:column("Volume.Volume")')
    From Volume where volume.documentID = tbl_Archive.DocumentID

На меня влияет 1 строка, но когда я смотрю на XML, он не изменился, и я не могу понять, что нужно исправить, чтобы он работал.Узел не типизирован, если это имеет какое-либо значение.

1 Ответ

4 голосов
/ 17 декабря 2010

Обновление не будет работать, если нет текста для замены ... XPath /x:Document/x:Volume/text())[1] вернет пустой набор.

Попробуйте вставить ...

UPDATE tbl_Archive
   SET XML.modify(' declare namespace x="http://www.redacted.com";
   insert text {sql:column("Volume.Volume")}
   as first into  (/x:Document/x:Volume)[1]')
    From Volume where volume.documentID = tbl_Archive.DocumentID

.. вам нужно будет удалить атрибут nil="true" ..

Нечто подобное может быть ..

 update tbl_Archive set XML.modify('delete /*:Document/*:Volume[text()]/@xsi:nil')
...