2015-09-18 2 views
1

Мне нужно проанализировать XML с многоуровневыми множественными элементами.Анализ многоуровневого XML в SQL Server

Образец XML:

<Studies> 
    <Study ID="1"> 
     <Site Id="1"> 
      <Participant ID="111"/> 
      <Participant ID="222"/> 
     </Site> 
     <Site Id="2"> 
      <Participant ID="333"/> 
      <Participant ID="444"/> 
     </Site> 
    </Study> 
    <Study ID="2"> 
     <Site Id="3"> 
      <Participant ID="555"/> 
      <Participant ID="666"/> 
     </Site> 
     <Site Id="4"> 
      <Participant ID="777"/> 
      <Participant ID="888"/> 
     </Site> 
    </Study> 
</Studies> 

Я попытался:

SELECT 
    StudyID = XC.value('@ID', 'int'), 
    SiteId = XC2.value('@Id', 'int'), 
    ParticipantId = XC3.value('@ID', 'int') 
FROM 
    @Xml.nodes('//Study') AS XT(XC) 
CROSS APPLY 
    xc.nodes('Site') AS XT2(XC2) 
CROSS APPLY 
    xc.nodes('Participant') AS XT3(XC3) 

Это не возвращает данные. Если я изменю

xc.nodes('Participant') AS XT3(XC3) 

в

xc.nodes('//Participant') AS XT3(XC3) 

возвращает 32 строки.

Я ожидаю 8 строк. Любые указатели?

+0

Вам нужно 'CROSS ОТНОСИТЬСЯ xc2.nodes ('участник') AS XT3 (xc3)' (см 'xc2' вместо' xc'!) –

ответ

1
SELECT 
    StudyID = XC.value('../../@ID', 'int'), 
    SiteId = XC.value('../@Id', 'int'), 
    ParticipantId = XC.value('@ID', 'int') 
FROM 
    @Xml.nodes('//Studies/Study/Site/Participant') AS XT(XC) 
+1

[SqlFiddleDemo] (HTTP : //sqlfiddle.com/#! 6/9eecb7db59d16c80417c72d1/3366/0) :) – lad2025

+0

@George Спасибо. Это работает :) – Nikhil

1

Пожалуйста, попробуйте следовать SQL XML query. Вы также можете обратиться к образцу Аркадам

declare @xml xml = ' 
<Studies> 
    <Study ID="1"> 
     <Site Id="1"> 
      <Participant ID="111"/> 
      <Participant ID="222"/> 
     </Site> 
     <Site Id="2"> 
      <Participant ID="333"/> 
      <Participant ID="444"/> 
     </Site> 
    </Study> 
    <Study ID="2"> 
     <Site Id="3"> 
      <Participant ID="555"/> 
      <Participant ID="666"/> 
     </Site> 
     <Site Id="4"> 
      <Participant ID="777"/> 
      <Participant ID="888"/> 
     </Site> 
    </Study> 
</Studies>' 


select 
    Study.value('@ID','int') as Study, 
    Site.value('@Id','int') as Site, 
    Participant.value('@ID','int') as Participant 
from 
    @xml.nodes('/Studies/Study') as StudiesTbl(Study) 
cross apply 
    StudiesTbl.Study.nodes('Site') as StudyTbl(Site) 
cross apply 
    StudyTbl.Site.nodes('Participant') as SiteTbl(Participant) 
Смежные вопросы