如何使用XQuery更新XML变量中的属性值?

时间:2016-11-29 17:10:26

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

尝试更新变量中包含的XML中的一个属性:

set @x.modify('declare namespace abc="http://abcsystems.com/";
replace value of
(/abc:App/abc:Client/abc:Addresses/abc:PostalAddress)[@AddressLine1] with "555 Service Rd."')

@AddressLine1[1]上有或没有下标的情况下尝试过。

这会引发错误:

  

Msg 2337,Level 16,State 1,Line 8
  XQuery [modify()]:'替换'的目标找到的最多只能是一个节点   '元素(abc {http://abcsystems.com/}:PostalAddress,xdt:untyped)*'

整个XML中只有一个PostalAddress元素。什么错误告诉我?

1 个答案:

答案 0 :(得分:2)

如果没有实际的XML,这是盲目的,但你可能正在寻找这个:

set @x.modify('declare namespace abc="http://abcsystems.com/";
replace value of
(/abc:App/abc:Client/abc:Addresses/abc:PostalAddress/@AddressLine1)[1] with "555 Service Rd."')

(xpath here)[1]通常用于强制执行单个节点

更新:工作示例

declare @x xml=
N'<abc:App xmlns:abc="http://abcsystems.com/">
  <abc:Client>
    <abc:Addresses>
      <abc:PostalAddress AddressLine1="test" />
    </abc:Addresses>
  </abc:Client>
</abc:App>';

set @x.modify('declare namespace abc="http://abcsystems.com/";
replace value of
(/abc:App/abc:Client/abc:Addresses/abc:PostalAddress/@AddressLine1)[1] 
with "555 Service Rd."');

select @x;

结果

<abc:App xmlns:abc="http://abcsystems.com/">
  <abc:Client>
    <abc:Addresses>
      <abc:PostalAddress AddressLine1="555 Service Rd." />
    </abc:Addresses>
  </abc:Client>
</abc:App>