微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从 XML 的所有路径获取键的值

如何解决从 XML 的所有路径获取键的值

我有一个 xml

<EmployeeDetails>
    <BusinessEntityID>3</BusinessEntityID>
    <StoreDetail>
        <Sale>
            <AnnualSales>800000</AnnualSales>
        </Sale>
        <Sale>
            <AnnualSales>300000</AnnualSales>
        </Sale>
    </StoreDetail>
    <Revenue>
        <StoreDetail>
            <Sale>
                <AnnualSales>800000</AnnualSales>
            </Sale>
            <Sale>
                <AnnualSales>300000</AnnualSales>
            </Sale>
        </StoreDetail>
    </Revenue>
    <Report>
        <Sale>
            <AnnualSales>900000</AnnualSales>
        </Sale>
    </Report>
</EmployeeDetails>

我希望从节点 AnnualSales 中找到 <sale> 的所有值。它可以在 EmployeeDetails-->StoreDetail-->SaleEmployeeDetails-->StoreDetail-->Revenue-->Sale 下,也可以在其他树下。无论路径如何,是否可以找到所有 sale

目前我使用下面的代码,我只得到一条路径(2行)

SELECT 
    X.Y.value('(AnnualSales)[1]','VARCHAR(20)') as AnnualSales
FROM test e
CROSS APPLY e.xml_data.nodes('EmployeeDetails/StoreDetail/Sale') as X(Y)

DbFiddle

预期输出

800000
300000
800000
300000
900000

解决方法

请尝试以下操作。

由于XML结构不一致,我们不得不在.nodes()方法中使用效率最低的XPath表达式。而且我不确定返回值的正确数据类型。恕我直言,可能是DECIMAL(x,y)

SQL

-- DDL and sample data population,start
DECLARE @tbl TABLE (ID INT IDENTITY PRIMARY KEY,xmldata XML);
INSERT INTO @tbl (xmldata) VALUES
(N'<EmployeeDetails>
    <BusinessEntityID>3</BusinessEntityID>
    <StoreDetail>
        <Sale>
            <AnnualSales>800000</AnnualSales>
        </Sale>
        <Sale>
            <AnnualSales>300000</AnnualSales>
        </Sale>
    </StoreDetail>
    <Revenue>
        <StoreDetail>
            <Sale>
                <AnnualSales>800000</AnnualSales>
            </Sale>
            <Sale>
                <AnnualSales>300000</AnnualSales>
            </Sale>
        </StoreDetail>
    </Revenue>
    <Report>
        <Sale>
            <AnnualSales>900000</AnnualSales>
        </Sale>
    </Report>
</EmployeeDetails>');
-- DDL and sample data population,end

SELECT c.value('(./text())[1]','VARCHAR(20)') AS AnnualSales
FROM @tbl CROSS APPLY xmldata.nodes('//AnnualSales') AS t(c);

输出

+-------------+
| AnnualSales |
+-------------+
|      800000 |
|      300000 |
|      800000 |
|      300000 |
|      900000 |
+-------------+

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。