Sql server 在SQLServer中解析多级XML

Sql server 在SQLServer中解析多级XML,sql-server,xml,Sql Server,Xml,我需要解析具有多级多元素的XML 示例XML: <Studies> <Study ID="1"> <Site Id="1"> <Participant ID="111"/> <Participant ID="222"/> </Site> <Site Id="2"> <Partici

我需要解析具有多级多元素的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>
这不会返回任何数据。如果我改变

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

它返回32行

不过我预计会有8排。有任何提示吗?

请尝试以下内容。您也可以参考示例教程

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)
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) 
declare@xml='xml'
'
选择
Study.value('@ID','int')作为研究,
Site.value('@Id','int')作为站点,
作为参与者的Participant.value('@ID','int')
从…起
@节点('/Studies/Study')作为StudiesTbl(Study)
交叉应用
StudiesTbl.Study.nodes('Site')作为StudyTbl(Site)
交叉应用
StudyTbl.Site.nodes('Participant')作为SiteTbl(Participant)

您需要
交叉应用xc2.节点(“参与者”)作为XT3(XC3)
(请参见
xc2
而不是
xc
!)
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)
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)