2014-01-02 3 views
1

Я читаю XML-документ с использованием XQuery в SQL Server. Это мой XML:XML xquery извлекает значение дочерних узлов из строки 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

Пожалуйста, помогите.

ответ

2

Просто измените запрос на это:

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. Чтобы получить groupkey и groupname, вы можете использовать ../ для перехода «вверх по дереву» на один уровень к родительскому узлу.

Смежные вопросы