【问题标题】:Change XML attribute values in SQL Server XML column更改 SQL Server XML 列中的 XML 属性值
【发布时间】:2014-03-23 06:41:03
【问题描述】:

我有一个 SQL Server 数据库表,如下所示:-

Id (int)       Info(xml)
------------------------
1       <xml....
2       <xml ...
3       <xml ...

Info 字段中每条记录中的 XML 类似于:-

<CodesParameter xmlns="http://mynamespace.com/" 
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<Data Code="A1" HasMoreData="true">
 .
 .
</Data>
</CodesParameter>

我希望能够更改 XML 中 &lt;Data Code="..."&gt; 的值,并尝试了以下查询:-

UPDATE MyTable
SET Info.modify('replace value of (Data[1]/@Code)with ("B1")')
WHERE Id = 2
Go

返回的消息表示查询执行成功,但值没有变化。

我尝试过声明命名空间:-

UPDATE MyTable
SET Info.modify('declare namespace myns="http://mynamespace.com/";
replace value of (/myns:WebTableParameter[1]/myns:DataTable[1]/@Code)with ("B1")')
WHERE Id = 2
Go

但结果相同 - 消息说查询已成功执行,但没有任何改变。

任何帮助表示赞赏。

【问题讨论】:

    标签: sql xml sql-server-2008 dml


    【解决方案1】:

    你有几个问题:

    1. 您完全忽略了相关 XML 文档中的 XML 命名空间(在您原来的 UPDATE 中)
    2. 您正在使用不完整的 XPath 表达式进行修改

    试试这个说法:

    ;WITH XMLNamespaces(DEFAULT 'http://mynamespace.com/')
    UPDATE dbo.MyTable
    SET Info.modify('replace value of (/CodesParameter/Data[1]/@Code)[1] with ("B1")')
    WHERE Id = 1
    

    基本上,您需要从 XML 文档的开始 - 您完全错过(或遗漏了)&lt;CodesParameter&gt; 节点。另外:您需要选择一个属性 - 因此您需要在括号后添加另一个 [1]

    使用此语句,我能够根据需要更新 XML。

    【讨论】:

    • 非常感谢,马克,这对我有用。这是一个错字错过了 节点,但我没有考虑额外的 [1]。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-14
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    相关资源
    最近更新 更多