Как вернуть данные из XML-файла - PullRequest
1 голос
/ 02 октября 2019

Как вернуть данные из товарной линейки. Я имею в виду: Количество, Единица количества

Я ожидаю:

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>

1 Ответ

1 голос
/ 02 октября 2019

Вторая outer apply просто умножит количество строк (1 x 2 x 2 = 4). Вы можете сделать это с одним оператором apply или максимум двумя:

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)
...