【问题标题】:How to get list of nested objects from xml with SQL Server?如何使用 SQL Server 从 xml 获取嵌套对象列表?
【发布时间】:2021-06-24 10:57:57
【问题描述】:

我想从 xml 对象中去嵌套对象。这是示例 xml:

<persons>
    <person>
        <person_name>
            <firstName>Jon</firstName>
            <lastName>Johnson</lastName>
        </person_name>
        <person_data>
            <number>1</number>
        </person_data>
        <body_parts>
            <body_part>Head</body_part>
            <body_part>Leg</body_part>
            <body_part>Nose</body_part>
        </body_parts>
    </person>
    <person>
        <person_name>
            <firstName>Kathy</firstName>
            <lastName>Carter</lastName>
        </person_name>
        <person_data>
            <number>2</number>
        </person_data>
        <body_parts>
            <body_part>Head</body_part>
            <body_part>Palm</body_part>
            <body_part>Eye</body_part>
        </body_parts>
    </person>
    <person>
        <person_name>
            <firstName>Bob</firstName>
            <lastName>Burns</lastName>
        </person_name>
        <person_data>
            <number>3</number>
        </person_data>
        <body_parts>
            <body_part>Leg</body_part>
        </body_parts>
    </person>
</persons>

这是我当前的代码:

DECLARE @xml XML;  
DECLARE @iterator int = 1
SET @xml = '<persons>
    <person>
        <person_name>
            <firstName>Jon</firstName>
            <lastName>Johnson</lastName>
        </person_name>
        <person_data>
            <number>1</number>
        </person_data>
        <body_parts>
            <body_part>Head</body_part>
            <body_part>Leg</body_part>
            <body_part>Nose</body_part>
        </body_parts>
    </person>
    <person>
        <person_name>
            <firstName>Kathy</firstName>
            <lastName>Carter</lastName>
        </person_name>
        <person_data>
            <number>2</number>
        </person_data>
        <body_parts>
            <body_part>Head</body_part>
            <body_part>Palm</body_part>
            <body_part>Eye</body_part>
        </body_parts>
    </person>
    <person>
        <person_name>
            <firstName>Bob</firstName>
            <lastName>Burns</lastName>
        </person_name>
        <person_data>
            <number>3</number>
        </person_data>
        <body_parts>
            <body_part>Leg</body_part>
        </body_parts>
    </person>
</persons>';  

SELECT p.p.value('(./person_name/firstName/text())[1]','varchar(20)') AS firstName,
       p.p.value('(./person_name/lastName/text())[1]','varchar(20)') AS lastName,
       p.p.value('(./body_parts/body_part)[1]','varchar(20)') AS X
FROM @XML.nodes('persons/person') p(p)
WHERE p.p.value('(./person_data/number/text())[1]','int') = 2;

结果:

Kathy   Carter  Head

我怎样才能得到所有的body_parts

【问题讨论】:

  • 对了,可以直接在XQuery中过滤.nodes('persons/person[person_data[number[text() = "2"]]]') p(p)

标签: sql-server xml


【解决方案1】:

正如我在之前答案的 cmets 中提到的,在 FROM 中添加对 body_part 节点的引用:

SELECT p.p.value('(./person_name/firstName/text())[1]','varchar(20)') AS firstName,
       p.p.value('(./person_name/lastName/text())[1]','varchar(20)') AS lastName,
       bp.bp.value('(./text())[1]','varchar(20)') AS body_part
FROM @XML.nodes('persons/person') p(p)
     CROSS APPLY p.p.nodes('./body_parts/body_part') bp(bp)
WHERE p.p.value('(./person_data/number/text())[1]','int') = 2;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    相关资源
    最近更新 更多