OpenXML Импорт XML файла в sql, который содержит элемент и атрибут вместе

47
6

У меня есть сотни файлов от разных поставщиков, из которых я получаю одни и те же данные, отформатированные в формате 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>

*** Код 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

введите описание изображения здесь

заранее спасибо

спросил(а) 2017-04-06T21:51:00+03:00 2 года, 8 месяцев назад
1
Решение
54

FROM OPENXML с соответствующими SP для подготовки и удаления документа устарел и больше не должен использоваться (существуют редкие исключения). Скорее используйте соответствующие методы, предоставляемые типом данных XML.

В вашем случае вы можете использовать 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 |
+------------+------------------+------------+-----------------------+------------------+------------+

ответил(а) 2017-04-07T09:48:00+03:00 2 года, 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема