t-sql基于另一个元素值更新XML元素值

时间:2015-06-09 18:52:00

标签: sql-server xml tsql sql-server-2012 xml-dml

使用SQL Server 2012,如果我在XML类型列的一行中具有以下值:

<ArrayOfScheduledJobParameters xmlns="http://schemas.data.org/ScheduledJobServiceLibrary">
  <ScheduledJobParameters>
    <Key>OutputFileName</Key>
    <Value>CPVR{0}.txt</Value>
  </ScheduledJobParameters>
  <ScheduledJobParameters>
    <Key>DaysBeforeExpiration</Key>
    <Value>60</Value>
  </ScheduledJobParameters>
  <ScheduledJobParameters>
    <Key>MaxItemsByReportServiceCall</Key>
    <Value>100</Value>
  </ScheduledJobParameters>
</ArrayOfScheduledJobParameters>

我想根据元素<Value>中包含的值更改元素<Key>的值。具体来说,我希望能够将<Value>设置为150,其中元素<Key>包含值'MaxItemsByReportServiceCall'。我所能做的就是更新<ScheduledJobParameters>的第一个节点。如果我在XML DML上阅读的任何文档中都可以实现,我找不到怎么做。

1 个答案:

答案 0 :(得分:2)

您可以使用函数modify()并更正XQuery来设置所需的值。但语法非常棘手:

UPDATE YourTableName
SET ColumnName.modify('declare namespace NS="http://schemas.data.org/ScheduledJobServiceLibrary";replace value of (/NS:ArrayOfScheduledJobParameters/NS:ScheduledJobParameters[NS:Key="MaxItemsByReportServiceCall"]/NS:Value/text())[1] with "150"')
WHERE <your conditions to select rows>

modify()函数中,您首先声明您的命名空间。然后使用replace value of并更正XQUery。对于XQuery,您可以找到具有值ScheduledJobParameters的子元素名称的MaxItemsByReportServiceCall元素,并选择其子元素值的文本。然后使用with "new value"更新字段。