使用Xquery替换xsi:nil =“true”的节点值

时间:2010-12-14 22:22:38

标签: sql-server xml xml-dml xml-nil

我正在尝试在SQL Server 2005中使用XQuery来更新保存在列中的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
)

我正在使用以下XQuery SQL语句来尝试更新表。

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 个答案:

答案 0 :(得分:4)

如果没有要替换的文本,更新将无法工作.. 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')