2017-04-06 53 views
1

我有几百个来自不同供应商的文件,我从中获取相同的XML格式的数据,并且需要从中导入数据。 我具有能够与(DescriptionDetail)元素的问题OpenXML将xml文件导入到具有元素和属性的sql中

<?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> 

*** SQL代码应用于XML带来

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

在此先感谢

回答

0

FROM OPENXML与相应的SPs准备和删除文件已过时,不应再使用(罕见除外离子存在)。而是使用适当的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>'; 

--The查询

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 | 
+------------+------------------+------------+-----------------------+------------------+------------+ 
相关问题