Sql 服务器 2008R2 XML 导出

Sql Server 2008R2 XML export

我在将数据从我们的数据库导出到 XML 时遇到了一些问题。我可能有点不知所措,因为我之前没有 XML 知识,但是嘿,这有多难:)

我们已经通过 excel sheet 发送此数据,但现在客户希望将其作为 XML 发送。上传到他们的系统后,我可以将其下载为 XML,下面是该文件的一部分,

    <?xml version="1.0" encoding="ISO-8859-1"?>
<PricatHead xmlns="xxxxx"
           preOrderTo="2015-06-01T23:59:59"
           name="15005-3"
           merchant="xxxx"
           customer="xxxxx"
           validFrom="2014-08-01T00:00:00"
           validTo="2015-06-01T23:59:59"
           currency="SEK"
           contractDiscount="0">
  <sprProduct itemID="86035-8"
              name="xxxx"
              description="xxxxxx"
              tax="0.00"
              eanCode=""
              eanType="EAN 13"
              color="BLACK"
              colorCode="C0100"
              size="36"
              sizeRange="EURO size"
              modelNo="86035"
              inSelection="N"
              productDiscount="0">
    <priceBracket quantity="1"
                  price="x"
                  grossPrice="xxxx"
                  validOrderDateFrom="2014-08-01T00:00:00"
                  validOrderDateTo="2015-06-01T00:00:00"
                  validShipDateFrom="2015-02-15T00:00:00"
                  validShipDateTo="2015-06-01T00:00:00"
                  type="PRE"/>
    <priceBracket quantity="1"
                  price="x"
                  grossPrice="x"
                  validOrderDateFrom="2015-02-15T00:00:00"
                  validOrderDateTo="2015-06-01T00:00:00"
                  validShipDateFrom="2015-02-15T00:00:00"
                  validShipDateTo="2015-06-01T00:00:00"
                  type=""/>
    <variantValue name="unit"
                  value="pcs"/>
    <variantValue name="recPrice_SEK"
                  value="x"/>
    <variantValue name="recCampaignPrice_SEK"
                  value="0"/>
    <variantValue name="brand"
                  value="x"/>
    <variantValue name="goodsClass"
                  value="4052"/>
    <variantValue name="recCampaignPriceCurrency"
                  value="SEK"/>
    <variantValue name="recWebPriceCurrency"
                  value="SEK"/>
    <variantValue name="unitType"
                  value="pcs"/>
    <variantValue name="x"
                  value="2603"/>
    <variantValue name="marketingInfo"
                  value="xxxxx"/>
    <variantValue name="preOrderDiscountHQ"
                  value="0"/>
    <variantValue name="grossPriceCurrency"
                  value="SEK"/>
    <variantValue name="productPicture_1"
                  value="xxx"/>
    <variantValue name="suppOrderCurrency"
                  value="SEK"/>
    <variantValue name="preOrderCurrency"
                  value="SEK"/>
    <variantValue name="productPicture_3"
                  value="xxx"/>
    <variantValue name="productPicture_2"
                  value="xxxx"/>
    <variantValue name="invoiceMethod"
                  value="net"/>
    <variantValue name="logisticUnit"
                  value="cu"/>
    <variantValue name="countryOfOrigin"
                  value="CN"/>
    <variantValue name="suppOrderDiscountHQ"
                  value="0"/>
    <variantValue name="customsTariffNo_SE"
                  value="6402999300"/>
  </sprProduct>

对于 excel sheet 我有一个 SQL 程序生成一个大的 table 包含所有上述数据,其中 <sprProduct> 是一行并且其余列。 我可以毫无问题地创建 <pricatHead><sprProduct> 标签,但是我使用 <priceBracket> 失败了,因为它们也是 select 语句中的列,而且我有多个需要的列他们自己的 <priceBracket><variantValue> 导致同样的问题。

很难解释,但是一个 sql 行应该产生多个 <priceBracket><variantValue>

到目前为止,我的代码如下所示(已缩短),

--Pricat HEAD
select 
PrisLista as [@name]
,gtinMerchant as [@merchant]
,gtinCustomer as [@customer]

--Pricat ROWS
,(  select 
    ar.ArtNr as [@itemID]
    ,ar.ArtBeskr as [@name]
    ,ar.ArtBeskrLong as [@description]
    ,prl.vat as [@tax]
    ,prl.quantity as [sprProduct/priceBracket/@quantity] 
    .........
    from prl
    for xml path ('sprProduct'), type)


from prh 
FOR XML PATH ('PricatHead')

如何让特定行的每一列生成自己的带有属性值的标签?

作为第二个问题,我还从客户那里得到了这个 XML 文件的 XSD 架构。这可以用来帮助格式化从我的数据库导出的数据以匹配他们所需的 XML 文件吗?

如果您想将 priceBracket 嵌套在 sprProduct 中,则将 selected XML 列别名为 [sprProduct/priceBracket]。要创建嵌套节点的属性,请使用 @ 前缀,例如 [sprProduct/priceBracket/@quanity].

这是一个示例脚本,展示了如何创建您提到的不同排列。

select
    -- row level attributes
    1 as [@a],
    2 as [@b],
    3 as [@c],
    -- node level attributes
    4 as [sprProduct/@a],
    5 as [sprProduct/@b],
    6 as [sprProduct/@c],
    -- nested section
    (select 
        'a1' as [@a],
        'a2' as [@b],
        'a3' as [@c]
     for xml path ('priceBracket'), type),
    -- repeated nested section
    (select 
        'b1' as [@a],
        'b2' as [@b],
        'b3' as [@c]
     for xml path ('priceBracket'), type)
for xml path ('PricatHead'), type

实际上,子 select 会在主键上将您的源 table 连接到自身,以便能够访问与外部 [=19] 在同一行中的列=].