Sql Server 2008R2 XML导出

时间:2015-03-26 09:02:46

标签: sql-server xml xsd

将数据从数据库导出到XML时遇到一些问题。我可能已经过头了,因为我没有早期的XML知识,但是嘿,它有多难:)

我们已经通过Excel工作表发送此数据,但现在客户希望将其作为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表,我有一个SQL序列,它产生一个包含所有上述数据的大表,其中<sprProduct>是一行,其余列。 我没有问题来创建<pricatHead><sprProduct>标记,但我失败了<priceBracket>,因为它们也是select语句中的列,我有多个列需要自己的<priceBracket> 1}}。 <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文件吗?

1 个答案:

答案 0 :(得分:0)

如果要在sprProduct中嵌套priceBracket,则将选定的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

实际上,子选择会将源表连接到主键上,以便能够访问与外部选择相同的行中的列。