在SQL Server XML列中更改XML属性值

时间:2014-02-21 16:23:44

标签: sql xml sql-server-2008 dml

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

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

“信息”字段中每条记录中的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中更改<Data Code="...">的值并尝试以下查询: -

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

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

任何帮助表示感谢。

1 个答案:

答案 0 :(得分:1)

你有几个问题:

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

    ;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文档的根开始 - 您完全错过(或遗漏)<CodesParameter>节点。另外:您需要选择一个属性 - 因此在括号后需要另一个[1]

    通过这个声明,我能够根据需要更新XML。