选择没有特定X子项的项目

时间:2014-12-16 20:38:32

标签: sql-server xml sql-server-2008 xquery

对于以下xml

<Root>
  <A><B>....</B></A>
  <A><B>....</B><X>...</X></A>

我在SQL Server 2008R2中使用以下xquery。如何获取A没有孩子X的元素?

select @xml.query('<r>...
{ for $a in //A return 
   <a>... {... $a[????] ...} .... (: use $a which doesn''t have child X only :)
     { for $x in $a/X return <x>... $x ...</x> } (: otherwise use //a/x :)
   </a>
}</r>')

更新 可测试的例子:

declare @xml xml = '
<Root>
  <A><B>123</B><C>***</C></A>
  <A><B>456</B><C>***</C><X>abc</X></A>
</Root>'

select @xml.query('<r>
{ for $a in //A return 
   <a>{ $a/B/text() }  (: use $a which doesn''t have child X only :)
     { for $x in $a/X return $x/text() } (: otherwise use //a/x :)
   </a>
}</r>')

预期<r><a>123</a><a>abc</a></r>而不是<r><a>123</a><a>456abc</a></r>

2 个答案:

答案 0 :(得分:1)

declare @xml xml = '
<Root>
  <A><B>123</B></A>
  <A><B>456</B><X>abc</X></A>
</Root>'

select @xml.query('
<r>{
    for $a in //A
    return <a>{
        if (count($a/X) = 0)
        then $a/*/text()
        else $a/X/text()
    }</a>
}</r>
')

答案 1 :(得分:0)

for $a in //A return 
element { node-name($a) } {
  $a/*[local-name(.) != 'X']
}

动态重建元素名称不是必需的,但假设这是一个简化的示例,如果您在迭代不同的元素名称,它可能会派上用场。