2017-04-06 52 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 | 
+------------+------------------+------------+-----------------------+------------------+------------+ 
相關問題