【问题标题】:Insert order details from XML into SQL database table将 XML 中的订单详细信息插入 SQL 数据库表
【发布时间】:2023-02-01 06:57:21
【问题描述】:

我想将此 XML 文件(API 响应)作为列插入到数据库表中。当响应包含唯一订单 ID 的两个不同项目时,应为两个不同的项目插入订单 ID 列。

这是应该是这样的结果:

row #1  order id: i6tp-pucp-dsrx-1gg7-ikef  item_no: 2304
row #2  order id: i6tp-pucp-dsrx-1gg7-ikef  item_no: 10914

这是我从 XML 形式的 API 获得的响应:

<?xml version="1.0" encoding="UTF-8" standalone="yes"? ><ns1:result xmlns:ns1="url.xsd">
<ns1:orders>
    <ns1:order>
        <ns1:code>i6tp-pucp-dsrx-1gg7-ikef</ns1:code>
        <ns1:status>CONFIRMED</ns1:status>
        <ns1:date>2022-11-30T20:50:36.920</ns1:date>
        <ns1:deliveryAddress>
            <ns1:firstName>fname</ns1:firstName>
            <ns1:lastName>lastname</ns1:lastName>
            <ns1:streetname>streetname </ns1:streetname>
            <ns1:streetnumber>stno</ns1:streetnumber>
            <ns1:town>town</ns1:town>
            <ns1:postalCode>PLZ</ns1:postalCode>
            <ns1:gender>FEMALE</ns1:gender>
            <ns1:deliveryAddressType>address</ns1:deliveryAddressType>
        </ns1:deliveryAddress>
        <ns1:paymentAddress>
            <ns1:firstName>fname</ns1:firstName>
            <ns1:lastName>lastname</ns1:lastName>
            <ns1:streetname>streetname </ns1:streetname>
            <ns1:streetnumber>stno</ns1:streetnumber>
            <ns1:town>town</ns1:town>
            <ns1:postalCode>PLZ</ns1:postalCode>
            <ns1:gender>FEMALE</ns1:gender>
        </ns1:paymentAddress>
        <ns1:currency>EUR</ns1:currency>
        <ns1:entries>
            <ns1:entry>
                <ns1:sku>2304</ns1:sku>
                <ns1:quantity>1</ns1:quantity>
                <ns1:basePrice>18.49</ns1:basePrice>
                <ns1:totalBasePrice>18.49</ns1:totalBasePrice>
                <ns1:merchantSubTotal>18.49</ns1:merchantSubTotal>
                <ns1:totalPrice>18.49</ns1:totalPrice>
                <ns1:name>ArtNo1</ns1:name>
                <ns1:taxClass>at-vat-full</ns1:taxClass>
                <ns1:warehouse>001-default-warehouse</ns1:warehouse>
            </ns1:entry>
            <ns1:entry>
                <ns1:sku>10914</ns1:sku>
                <ns1:quantity>1</ns1:quantity>
                <ns1:basePrice>49.99</ns1:basePrice>
                <ns1:totalBasePrice>49.99</ns1:totalBasePrice>
                <ns1:merchantSubTotal>49.99</ns1:merchantSubTotal>
                <ns1:totalPrice>49.99</ns1:totalPrice>
                <ns1:name>Artno2</ns1:name>
                <ns1:taxClass>at-vat-full</ns1:taxClass>
                <ns1:warehouse>001-default-warehouse</ns1:warehouse>
            </ns1:entry>
        </ns1:entries>
        <ns1:cancelOrders/>
        <ns1:returnOrders/>
        <ns1:delayOrders/>
        <ns1:consignments/>
        <ns1:totalBasePrice>68.48</ns1:totalBasePrice>
        <ns1:merchantDiscountTotal>0</ns1:merchantDiscountTotal>
        <ns1:merchantSubTotal>68.48</ns1:merchantSubTotal>
        <ns1:marketplaceDiscountTotal>0</ns1:marketplaceDiscountTotal>
        <ns1:subtotal>68.48</ns1:subtotal>
        <ns1:deliveryCost>0.0</ns1:deliveryCost>
        <ns1:paymentCost>0.0</ns1:paymentCost>
        <ns1:totalPrice>68.48</ns1:totalPrice>
        <ns1:paymentMode>payment</ns1:paymentMode>
        <ns1:deliveryMode>E+2</ns1:deliveryMode>
        <ns1:additionalDeliveryOption>E2_1</ns1:additionalDeliveryOption>
        <ns1:deliveryConfiguration>Post</ns1:deliveryConfiguration>
        <ns1:shipmentDate>2022-12-02T07:00:11.680</ns1:shipmentDate>
        <ns1:estimatedDeliveryDate>2022-12-06T07:00:11.680</ns1:estimatedDeliveryDate>
        <ns1:avisoData>
            <ns1:address>
                <ns1:line>line1</ns1:line>
                <ns1:line>line2</ns1:line>
                <ns1:line>line3</ns1:line>
            </ns1:address>
            <ns1:phone>0123456789</ns1:phone>
            <ns1:email>info@gmail.com</ns1:email>
        </ns1:avisoData>
    </ns1:order>
</ns1:orders></ns1:result>

【问题讨论】:

  • XML 支持是高度特定于供应商- 所以请添加一个标签来指定您使用的是mysqlpostgresqlsql-serveroracle 还是db2 - 或者其他完全不同的东西。
  • 您好,感谢您编辑我的问题。是的,我正在使用 sql -server
  • 您的 XML 包含XML 命名空间前缀ns1: 在你的元素中 - 但你没有向我们展示 XML 命名空间是如何定义的......这是解决方案的关键部分 - 你能把这个添加到你的问题中吗?
  • 在订购之前它只有 <ns1:result></ns1:result> 我不知道为什么它不允许我编辑我的问题。

标签: sql-server xml xquery


【解决方案1】:

尝试这样的事情 - 显然,如前所述 - 我不知道您的 XML 名称空间声明是什么样的,所以我只是伪造的它在这里 - 根据需要调整....

DECLARE @Data XML = 
'<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:orders xmlns:ns1="urn:somenamespace">
    <ns1:order>
        <ns1:code>i6tp-pucp-dsrx-1gg7-ikef</ns1:code>
        <ns1:status>CONFIRMED</ns1:status>
        <ns1:date>2022-11-30T20:50:36.920</ns1:date>
        <ns1:deliveryAddress>
            <ns1:firstName>fname</ns1:firstName>
            <ns1:lastName>lastname</ns1:lastName>
            <ns1:streetname>streetname </ns1:streetname>
            <ns1:streetnumber>stno</ns1:streetnumber>
            <ns1:town>town</ns1:town>
            <ns1:postalCode>PLZ</ns1:postalCode>
            <ns1:gender>FEMALE</ns1:gender>
            <ns1:deliveryAddressType>address</ns1:deliveryAddressType>
        </ns1:deliveryAddress>
        <ns1:paymentAddress>
            <ns1:firstName>fname</ns1:firstName>
            <ns1:lastName>lastname</ns1:lastName>
            <ns1:streetname>streetname </ns1:streetname>
            <ns1:streetnumber>stno</ns1:streetnumber>
            <ns1:town>town</ns1:town>
            <ns1:postalCode>PLZ</ns1:postalCode>
            <ns1:gender>FEMALE</ns1:gender>
        </ns1:paymentAddress>
        <ns1:currency>EUR</ns1:currency>
        <ns1:entries>
            <ns1:entry>
                <ns1:sku>2304</ns1:sku>
                <ns1:quantity>1</ns1:quantity>
                <ns1:basePrice>18.49</ns1:basePrice>
                <ns1:totalBasePrice>18.49</ns1:totalBasePrice>
                <ns1:merchantSubTotal>18.49</ns1:merchantSubTotal>
                <ns1:totalPrice>18.49</ns1:totalPrice>
                <ns1:name>ArtNo1</ns1:name>
                <ns1:taxClass>at-vat-full</ns1:taxClass>
                <ns1:warehouse>001-default-warehouse</ns1:warehouse>
            </ns1:entry>
            <ns1:entry>
                <ns1:sku>10914</ns1:sku>
                <ns1:quantity>1</ns1:quantity>
                <ns1:basePrice>49.99</ns1:basePrice>
                <ns1:totalBasePrice>49.99</ns1:totalBasePrice>
                <ns1:merchantSubTotal>49.99</ns1:merchantSubTotal>
                <ns1:totalPrice>49.99</ns1:totalPrice>
                <ns1:name>Artno2</ns1:name>
                <ns1:taxClass>at-vat-full</ns1:taxClass>
                <ns1:warehouse>001-default-warehouse</ns1:warehouse>
            </ns1:entry>
        </ns1:entries>
        <ns1:cancelOrders/>
        <ns1:returnOrders/>
        <ns1:delayOrders/>
        <ns1:consignments/>
        <ns1:totalBasePrice>68.48</ns1:totalBasePrice>
        <ns1:merchantDiscountTotal>0</ns1:merchantDiscountTotal>
        <ns1:merchantSubTotal>68.48</ns1:merchantSubTotal>
        <ns1:marketplaceDiscountTotal>0</ns1:marketplaceDiscountTotal>
        <ns1:subtotal>68.48</ns1:subtotal>
        <ns1:deliveryCost>0.0</ns1:deliveryCost>
        <ns1:paymentCost>0.0</ns1:paymentCost>
        <ns1:totalPrice>68.48</ns1:totalPrice>
        <ns1:paymentMode>payment</ns1:paymentMode>
        <ns1:deliveryMode>E+2</ns1:deliveryMode>
        <ns1:additionalDeliveryOption>E2_1</ns1:additionalDeliveryOption>
        <ns1:deliveryConfiguration>Post</ns1:deliveryConfiguration>
        <ns1:shipmentDate>2022-12-02T07:00:11.680</ns1:shipmentDate>
        <ns1:estimatedDeliveryDate>2022-12-06T07:00:11.680</ns1:estimatedDeliveryDate>
        <ns1:avisoData>
            <ns1:address>
                <ns1:line>line1</ns1:line>
                <ns1:line>line2</ns1:line>
                <ns1:line>line3</ns1:line>
            </ns1:address>
            <ns1:phone>0123456789</ns1:phone>
            <ns1:email>info@gmail.com</ns1:email>
        </ns1:avisoData>
    </ns1:order>
</ns1:orders>';

使用 SQL Server XQuery 支持使用此 SQL 查询来获取您的数据项:

WITH XMLNAMESPACES('urn:somenamespace' AS ns1)
SELECT
    OrderNo = xc.value('(ns1:code)[1]', 'varchar(50)'),
    ItemNo = xc2.value('(ns1:sku)[1]', 'int')
FROM
    @Data.nodes('/ns1:orders/ns1:order') AS XT(XC)
CROSS APPLY
    XC.nodes('ns1:entries/ns1:entry') AS XT2(XC2)

这将返回以下结果:

OrderNo                     ItemNo
-----------------------------------
i6tp-pucp-dsrx-1gg7-ikef     2304
i6tp-pucp-dsrx-1gg7-ikef    10914

【讨论】:

  • 我还可以如何在带有 rowno 的订单号旁边添加一列,如下所示: RowNo OrderNo ItemNo -------------------------------- -------------- 1 i6tp-pucp-dsrx-1gg7-ikef 2304 1 i6tp-pucp-dsrx-1gg7-ikef 10914
  • 我已经通过添加 DENSE_RANK() 解决了它,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 2020-06-01
  • 1970-01-01
  • 2013-07-19
  • 2018-07-11
  • 2023-03-30
相关资源
最近更新 更多