如何解决从 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-->Sale
或 EmployeeDetails-->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)
预期输出:
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 举报,一经查实,本站将立刻删除。