OpenXML将xml文件导入到具有元素和属性的sql中

时间:2017-04-06 18:51:22

标签: sql xml

我有来自不同供应商的数百个文件,我从中获取相同的XML格式数据并需要从中导入数据。 我遇到了(DescriptionDetail)元素的问题

<?xml version="1.0" encoding="UTF-8"?>
<Items>
    <Item>
        <PartNumber>075050</PartNumber>
            <Descriptions>
               <DescriptionDetail Maintenance="A" LanguageCode="EN" DescriptionCode="DES">Ring Gear Spacer</DescriptionDetail>
               <DescriptionDetail Maintenance="A" LanguageCode="EN" DescriptionCode="SHO">Spacer</DescriptionDetail>
               <DescriptionDetail Maintenance="A" LanguageCode="EN" DescriptionCode="INV">Ring Gear Pt </DescriptionDetail>
               <DescriptionDetail Maintenance="A" LanguageCode="EN" DescriptionCode="EXT">Gear Spacer</DescriptionDetail>
            </Descriptions>
        </Item>
        <Item>
           <PartNumber>1100</PartNumber>
           <Descriptions>
              <DescriptionDetail Maintenance="A" LanguageCode="EN" DescriptionCode="DES">Shim Pack</DescriptionDetail>
              <DescriptionDetail Maintenance="A" LanguageCode="EN" DescriptionCode="SHO">Shim Pack</DescriptionDetail>
              <DescriptionDetail Maintenance="A" LanguageCode="EN" DescriptionCode="INV">Chrysler/Dana/Ford/GM</DescriptionDetail>
              <DescriptionDetail Maintenance="A" LanguageCode="EN" DescriptionCode="EXT">Pinion Shim Pack</DescriptionDetail>
              <DescriptionDetail Maintenance="A" LanguageCode="EN" DescriptionCode="MKT"> Win a Gear</DescriptionDetail>
        </Descriptions>
    </Item>
</Items>

***用于引入XML的SQL代码

USE XYZCompany
INSERT INTO XMLwithOpenXML(XMLData, LoadedDateTime)
SELECT CONVERT(XML, BulkColumn) AS BulkColumn, GETDATE() 
FROM OPENROWSET(BULK '\\SRETDM\Attributes\Frank Gerster\CustXML-Changed\MGPIES-Items.XML', SINGLE_BLOB) AS x;

*** SQL Code used to select the information
USE XYZCompany
GO
DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX)
SELECT @XML = XMLData FROM XMLwithOpenXML
EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML
SELECT Maintenance,LanguageCode,DescriptionCode,PartNumber,DescriptionDetail
FROM OPENXML(@hDoc, '/Items/Item/Descriptions/DescriptionDetail')
WITH 
(
PartNumber [varchar](50) '../../PartNumber',
DescriptionDetail [varchar](50) 'DescriptionDetail',
MaintenanceType [varchar](50) '@MaintenanceType',
LanguageCode [varchar](50) '@LanguageCode',
DescriptionCode [varchar](50) '@DescriptionCode'
)
EXEC sp_xml_removedocument @hDoc
GO

enter image description here

提前致谢

1 个答案:

答案 0 :(得分:0)

FROM OPENXML与相应的SP准备和删除文档已经过时,不应再使用(很少有例外)。而是使用适当的methods the XML data type provides

在您的情况下,您可以使用predicate来获取右侧<DescriptionDetail>。以下假定XML被读入类型化的XML变量:

DECLARE @xml XML=
'<?xml version="1.0" encoding="UTF-8"?>
<Items>
    <Item>
        <PartNumber>075050</PartNumber>
            <Descriptions>
               <DescriptionDetail Maintenance="A" LanguageCode="EN" DescriptionCode="DES">Ring Gear Spacer</DescriptionDetail>
               <DescriptionDetail Maintenance="A" LanguageCode="EN" DescriptionCode="SHO">Spacer</DescriptionDetail>
               <DescriptionDetail Maintenance="A" LanguageCode="EN" DescriptionCode="INV">Ring Gear Pt </DescriptionDetail>
               <DescriptionDetail Maintenance="A" LanguageCode="EN" DescriptionCode="EXT">Gear Spacer</DescriptionDetail>
            </Descriptions>
        </Item>
        <Item>
           <PartNumber>1100</PartNumber>
           <Descriptions>
              <DescriptionDetail Maintenance="A" LanguageCode="EN" DescriptionCode="DES">Shim Pack</DescriptionDetail>
              <DescriptionDetail Maintenance="A" LanguageCode="EN" DescriptionCode="SHO">Shim Pack</DescriptionDetail>
              <DescriptionDetail Maintenance="A" LanguageCode="EN" DescriptionCode="INV">Chrysler/Dana/Ford/GM</DescriptionDetail>
              <DescriptionDetail Maintenance="A" LanguageCode="EN" DescriptionCode="EXT">Pinion Shim Pack</DescriptionDetail>
              <DescriptionDetail Maintenance="A" LanguageCode="EN" DescriptionCode="MKT"> Win a Gear</DescriptionDetail>
        </Descriptions>
    </Item>
</Items>';

- 查询

SELECT pn.value(N'(PartNumber/text())[1]','int') AS PartNumber
      ,pn.value(N'(Descriptions/DescriptionDetail[@DescriptionCode="DES"]/text())[1]','nvarchar(max)') AS Detail_DES
      ,pn.value(N'(Descriptions/DescriptionDetail[@DescriptionCode="SHO"]/text())[1]','nvarchar(max)') AS Detail_SHO
      ,pn.value(N'(Descriptions/DescriptionDetail[@DescriptionCode="INV"]/text())[1]','nvarchar(max)') AS Detail_INV
      ,pn.value(N'(Descriptions/DescriptionDetail[@DescriptionCode="EXT"]/text())[1]','nvarchar(max)') AS Detail_EXT
      ,pn.value(N'(Descriptions/DescriptionDetail[@DescriptionCode="MKT"]/text())[1]','nvarchar(max)') AS Detail_MKT
FROM @xml.nodes(N'/Items/Item') AS A(pn)

结果

+------------+------------------+------------+-----------------------+------------------+------------+
| PartNumber | Detail_DES       | Detail_SHO | Detail_INV            | Detail_EXT       | Detail_MKT |
+------------+------------------+------------+-----------------------+------------------+------------+
| 75050      | Ring Gear Spacer | Spacer     | Ring Gear Pt          | Gear Spacer      | NULL       |
+------------+------------------+------------+-----------------------+------------------+------------+
| 1100       | Shim Pack        | Shim Pack  | Chrysler/Dana/Ford/GM | Pinion Shim Pack | Win a Gear |
+------------+------------------+------------+-----------------------+------------------+------------+