【问题标题】:SQL Server XML multi-level querySQL Server XML 多级查询
【发布时间】:2019-05-20 00:52:56
【问题描述】:

我有以下需要查询的 xml:

declare @xml 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>'

我需要以下结果:

Property1 Property2 Child
Value1    Value2    Child1
Value1    Value2    Child2
Value3    Value4    Child3
Value3    Value4    Child4

我有这个问题:

select col.value('Property1','varchar(100)') Property1,
       col.value('Property2','varchar(100)') Property2
from @xml.nodes('//root/level1') as tab(col)

但我不知道如何将父节点与其子节点连接起来。有什么想法吗?

【问题讨论】:

  • 我不认为你的 XML 是这样格式化的。根据本例,level2ListProperty1property2Level节点下的姐妹节点。

标签: sql sql-server xml tsql sql-server-2016


【解决方案1】:

你可以从底部开始搜索:

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)

或者通过扩展您最初的尝试:

FROM @xml.nodes('//level1') AS n1(l1)
CROSS APPLY l1.nodes('.//level2') AS n2(l2)

【讨论】:

  • 好+1,试图注意到这和我的不同。最大的是x(n) 而不是N(X) :)
【解决方案2】:

我会使用以下内容:

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)

【讨论】:

    【解决方案3】:

    你也可以使用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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多