如何使用XML和Xquery选择父节点属性及其子值?

时间:2010-10-18 10:37:28

标签: sql xml xpath xquery

我有这个:

<pss>
<ps n="А parent node" m="654564654" t="435,8551" a="2857,2716">
      <sc s="a1" a="25,4220"/>
      <sc s="a2" a="0"/>
      <sc s="a3" a="2395,9945"/>
</ps>
...
</pss>

我需要在一个查询中选择“А父节点m属性和a1-a2 a值”。 我试过这个,但它不起作用:

SELECT ps.value('@m', 'nvarchar(50)') "parent node",
--       sc.value('@a1', 'nvarchar(50)') "название услуги",
--       sc.value('@a2', 'nvarchar(50)') "стоимость услуги",
       ps.value('@a3, 'nvarchar(50)') "b","
FROM   mts.dbo.bill 
OUTER APPLY xCol.nodes('//Report/rp/pss/ps') AS A(ps)
OUTER APPLY xCol.nodes('//Report/rp/pss/ps/sc/.') AS B(sc)

提前完成。

2 个答案:

答案 0 :(得分:0)

提供的XML文档中没有a1a2a3属性!

使用

  /pss/ps/@*[name(.)='n' or name(.)='m']
|
  /pss/ps/sc/@a

这是XPath表达式,用于从提供的XML文档中选择所需的节点。我不确定它应该如何组合成SQL命令。

答案 1 :(得分:0)

declare @document xml
set @document = N'
<pss>
    <ps n="А parent node" m="654564654" t="435,8551" a="2857,2716">
          <sc s="a1" a="25,4220"/>
          <sc s="a2" a="0"/>
          <sc s="a3" a="2395,9945"/>
    </ps>
</pss>'


select
    pses.ps.value(N'@m', N'NVARCHAR(10)')
    , scs.sc.value(N'@s', N'NVARCHAR(2)')
from
    @document.nodes(N'//ps') pses(ps)
cross apply
    pses.ps.nodes(N'//sc') scs(sc)