sqlserverxml多级查询

sqlserverxml多级查询,sql,sql-server,xml,tsql,sql-server-2016,Sql,Sql Server,Xml,Tsql,Sql Server 2016,我需要查询以下xml: declare@xml='xml' 价值1 价值2 孩子1 孩子2 价值3 价值4 孩子3 孩子4 ' 我需要以下结果: 属性1属性2子级 值1值2儿童1 值1值2儿童2 值3值4儿童3 值3值4儿童4 我有一个疑问: select col.value('Property1','varchar(100)') Property1, col.value('Property2','varchar(100)') Property2 from @xml.nodes

我需要查询以下xml:

declare@xml='xml'
价值1
价值2
孩子1
孩子2
价值3
价值4
孩子3
孩子4
'
我需要以下结果:

属性1属性2子级
值1值2儿童1
值1值2儿童2
值3值4儿童3
值3值4儿童4
我有一个疑问:

select col.value('Property1','varchar(100)') Property1,
       col.value('Property2','varchar(100)') Property2
from @xml.nodes('//root/level1') as tab(col)
但我不知道如何将父节点与其子节点连接起来。有什么想法吗?

我会使用以下方法:

SELECT
    X.value('(../../property1)[1]', 'varchar(20)') Property1,
    X.value('(../../property2)[1]', 'varchar(20)') Property2,
    X.value('.', 'varchar(20)') Child
FROM @xml.nodes('//level2') N(X)
我将使用以下方法:

SELECT
    X.value('(../../property1)[1]', 'varchar(20)') Property1,
    X.value('(../../property2)[1]', 'varchar(20)') Property2,
    X.value('.', 'varchar(20)') Child
FROM @xml.nodes('//level2') N(X)

您可以从底部开始搜索:

DECLARE @xml AS XML = '<root>
    <level1>
        <property1>Value1</property1>
        <property2>Value2</property2>
        <level2List>
            <level2>Child1</level2>
            <level2>Child2</level2>
        </level2List>
    </level1>
    <level1>
        <property1>Value3</property1>
        <property2>Value4</property2>
        <level2List>
            <level2>Child3</level2>
            <level2>Child4</level2>
        </level2List>
    </level1>
</root>';

SELECT
    n.value('../../property1[1]','varchar(100)') property1,
    n.value('../../property2[1]','varchar(100)') property2,
    n.value('.','varchar(100)') Child
FROM @xml.nodes('//level1//level2') AS x(n)

您可以从底部开始搜索:

DECLARE @xml AS XML = '<root>
    <level1>
        <property1>Value1</property1>
        <property2>Value2</property2>
        <level2List>
            <level2>Child1</level2>
            <level2>Child2</level2>
        </level2List>
    </level1>
    <level1>
        <property1>Value3</property1>
        <property2>Value4</property2>
        <level2List>
            <level2>Child3</level2>
            <level2>Child4</level2>
        </level2List>
    </level1>
</root>';

SELECT
    n.value('../../property1[1]','varchar(100)') property1,
    n.value('../../property2[1]','varchar(100)') property2,
    n.value('.','varchar(100)') Child
FROM @xml.nodes('//level1//level2') AS x(n)

您还可以使用
APPLY

SELECT col.value('property1[1]', 'varchar(100)') AS property1,
       col.value('property2[1]', 'varchar(100)') AS property2,
       col1.value('text()[1]','varchar(100)') AS Child
FROM @xml.nodes('root/level1') AS tab(col) OUTER APPLY 
     col.nodes('level2List/level2') tab1(col1);

您还可以使用
APPLY

SELECT col.value('property1[1]', 'varchar(100)') AS property1,
       col.value('property2[1]', 'varchar(100)') AS property2,
       col1.value('text()[1]','varchar(100)') AS Child
FROM @xml.nodes('root/level1') AS tab(col) OUTER APPLY 
     col.nodes('level2List/level2') tab1(col1);

我认为您的XML不是那样格式化的。根据这个例子,
level2List
Property1
property2
Level
节点下的姐妹节点。我不认为XML的格式是这样的。根据这个例子,
level2List
Property1
property2
Level
节点下的姐妹节点。Good+1,试图注意这与我的不同。最大的是
x(n)
,而不是
n(x)
:)Good+1,试图注意到这和我的不同。最大的是
x(n)
,而不是
n(x)
:)