sql - 如何从xml文件返回数据
问题描述
如何从 product-lineitems 返回数据。我的意思是:数量,数量单位
我预计:
Product-Id unit quantity tax-rate
0001 BOX 1.0 0.23
0002 PCS 1.0 0.23
我正在尝试这样:但它返回重复的行:(
WITH XMLNAMESPACES(DEFAULT N'www address')
SELECT o.value(N'(current-order-no/text())[1]',N'varchar(10)') AS OrderNo
, n.value(N'(quantity/text())[1]',N'varchar(10)') AS Qty
, u.value(N'@unit',N'varchar(10)') AS Unit
FROM
dbSupply.dbo.MyXmlTable t
CROSS APPLY
t.XMLData.nodes(N'/orders/order') A(o)
OUTER APPLY
A.o.nodes(N'product-lineitems/product-lineitem') B(n)
OUTER APPLY
A.o.nodes(N'product-lineitems/product-lineitem/quantity') C(u)
<orders xmlns="www address">
<order>
<order-date>2019-09-05</order-date>
<created-by>storefront</created-by>
<original-order-no>000001</original-order-no>
<currency>USD</currency>
<taxation>gross</taxation>
<invoice-no>0099999</invoice-no>
<product-lineitems>
<product-lineitem>
<product-id>0001</product-id>
<quantity unit="BOX">1.0</quantity>
<tax-rate>0.23</tax-rate>
</product-lineitem>
<product-lineitem>
<product-id>0002</product-id>
<quantity unit="PCS">1.0</quantity>
<tax-rate>0.23</tax-rate>
</product-lineitem>
</product-lineitems>
</order>
</orders>
解决方案
第二个outer apply
将简单地乘以行数(1 x 2 x 2 = 4)。您最多可以使用一个或两个应用运算符来执行此操作:
WITH XMLNAMESPACES(DEFAULT N'www address')
SELECT onode.value('(original-order-no)[1]', 'nvarchar(10)') AS OrderNo
, inode.value('(quantity)[1]', 'nvarchar(10)') AS Qty
, inode.value('(quantity/@unit)[1]', 'nvarchar(10)') AS Unit
FROM (
SELECT CAST('<orders xmlns="www address">
<order>
<order-date>2019-09-05</order-date>
<created-by>storefront</created-by>
<original-order-no>000001</original-order-no>
<currency>USD</currency>
<taxation>gross</taxation>
<invoice-no>0099999</invoice-no>
<product-lineitems>
<product-lineitem>
<product-id>0001</product-id>
<quantity unit="BOX">1.0</quantity>
<tax-rate>0.23</tax-rate>
</product-lineitem>
<product-lineitem>
<product-id>0002</product-id>
<quantity unit="PCS">1.0</quantity>
<tax-rate>0.23</tax-rate>
</product-lineitem>
</product-lineitems>
</order>
</orders>' AS XML)
) AS t(XMLData)
CROSS APPLY t.XMLData.nodes(N'/orders/order') onodes(onode)
CROSS APPLY onode.nodes(N'./product-lineitems/product-lineitem') inodes(inode)
推荐阅读
- android - 协程中未捕获异常
- javascript - 异步函数控制台乱序登录
- python - 无法使用 reticulate 更改用于与 R 交互的 Python
- c# - 带前缀和后缀的字母数字字符串排序
- python - 如何在字符串中搜索/提取模式?
- c# - 如何计算数组中的“平均值”、“最高”值和“最低”值?C#
- python - 在 cv.normalize() 之后,结果的像素为 0 ,为什么?
- sed - 在文件中追加字符串的命令
- android - isInBitmapMemoryCache 为不同的 url 返回 true
- javascript - 如何在 nodejs 上运行时将 Javascript 文件添加到 HTML