XML xquery从xml字符串中检索后代节点值

时间:2014-01-02 10:44:14

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

我在SQL Server中使用XQuery读取XML文档。这是我的XML:

  declare @xml as xml='
  <contactdata>
    <contacts>
      <groupkey>24</groupkey>
      <groupname>Test Group One</groupname>
      <contact>
        <contactkey>100</contactkey>
        <contactname>Test Contact One</contactname>
      </contact>
      <contact>
        <contactkey>111</contactkey>
        <contactname>Test Contact Two</contactname>
      </contact>
    </contacts>
    <contacts>
      <groupkey>26</groupkey>
      <groupname>Test Group Two</groupname>
       <contact>
        <contactkey>101</contactkey>
        <contactname>Test Contact Six</contactname>
      </contact>
    </contacts>
  </contactdata>';

为了检索每个组下的每个联系人详细信息,我正在使用此XQuery语法

select 
    c.value('(groupkey)[1]','int'),
    c.value('(groupname)[1]','nvarchar(max)'),
    c.value('(contact/contactkey)[1]','int'),
    c.value('(contact/contactname)[1]','nvarchar(max)')
from
@xml.nodes('contactdata/contacts') as Contacts(c)

但这只会返回每组下的第一个联系人。

Output2

但我需要这个输出

Output

请帮忙。

1 个答案:

答案 0 :(得分:3)

只需将您的查询更改为:

select 
    c.value('(../groupkey)[1]','int'),
    c.value('(../groupname)[1]','nvarchar(max)'),
    c.value('(contactkey)[1]','int'),
    c.value('(contactname)[1]','nvarchar(max)')
from
    @xml.nodes('contactdata/contacts/contact') as Contacts(c)

您需要获取所有<contact>元素的列表 - 然后从这些XML片段中提取必要的数据。要获取groupkeygroupname,您可以使用../在“树上”向上导航到父节点。