我有来自不同供应商的数百个文件,我从中获取相同的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
提前致谢
答案 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 |
+------------+------------------+------------+-----------------------+------------------+------------+