2016-09-02 1 views
1

enter image description hereCROSS는 하위 노드는 중복 레코드

나는이 XML (가독성에 대한 그것의 대부분을 제거)가 반환합니다. 나는 잘못된 기록을 얻는다. CAS_Number마다 잘못된 화학 이름을 가져 왔습니다. 하나의 CAS_Number은 하나의 화학 물질을 의미합니다. 하지만 여기에서는 같은 CAS_number에 대해 서로 다른 화학 이름을 사용합니다.

제 십자가에 적용하는 데 문제가 있지만 그것을 파악할 수 없습니다.

<ArrayOfCatalogItem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
<CatalogItem Version="1"> 
    <Msds xmlns="http://3ecompany.com/webservices/catalogitemxml"> 
    <ProductIdentifiers xmlns="http://3ecompany.com/webservices/catalogitemxml"> 
     <Identifier>M007628</Identifier> 
     <Source>CPN</Source> 
     <FirstExportDate xsi:nil="true" /> 
     <LastExportDate xsi:nil="true" /> 
     <FlaggedForResend xsi:nil="true" /> 
    </ProductIdentifiers> 
    <Ingredients> 
     <ChemicalName>Hexane</ChemicalName> 
     <Cas>000110-54-3</Cas> 
     <AvgPercent>20.000000</AvgPercent> 
     </Ingredients> 
     <Ingredients> 
     <ChemicalName>2-Propanone</ChemicalName> 
     <Cas>000067-64-1</Cas> 
     <AvgPercent>20.000000</AvgPercent> 
     </Ingredients> 
     <Ingredients> 
     <ChemicalName>Petroleum gases, liquefied, sweetened</ChemicalName> 
     <Cas>068476-86-8</Cas> 
     </Ingredients> 
    </Msds> 
</CatalogItem> 
</ArrayOfCatalogItem> 

저장 프로 시저는 다음과 같이 진행됩니다

DECLARE @XmlTable TABLE (XMLDATA XML) 

INSERT INTO @XmlTable(XMLData) 
    SELECT CONVERT(XML, BulkColumn) AS BulkColumn 
    FROM OPENROWSET(BULK 'C:\AA.Sample.File.LUS.Pilly-oneCI.xml', SINGLE_BLOB) AS x; 

;WITH XMLNAMESPACES ('http://3ecompany.com/webservices/catalogitemxml' as CI) 
SELECT 
    --CIVersion = CI.value('@Version', 'int'), 
    Identifier = PID.value('(.)\[1\]', 'varchar(9)'), 
    Product_Name = MSDSPN.value('(.)\[1\]','varchar(100)'), 
    CAS_Number = CAS.value('(.)\[1\]', 'varchar(20)'), 
    Chemical_Name = CN.value('(.)\[1\]', 'varchar(100)') 

FROM 
    @XmlTable 
CROSS APPLY 
    XMLData.nodes('/ArrayOfCatalogItem/CatalogItem') AS XT(CI) 
OUTER APPLY 
    CI.nodes('CI:ProductIdentifiers/CI:Identifier') AS XT2(PID) 
CROSS APPLY 
    CI.nodes('CI:Msds/CI:Ingredients/CI:Cas') AS XT18(CAS) 
CROSS APPLY 
    CI.nodes('CI:Msds/CI:Ingredients/CI:ChemicalName') AS XT19(CN) 

답변

3

이 시도 :

;WITH XMLNAMESPACES ('http://3ecompany.com/webservices/catalogitemxml' as CI) 
SELECT 
    Identifier = CI.value('(CI:ProductIdentifiers[1]/CI:Identifier)[1]', 'varchar(9)'), 
    CAS_Number = Ingred.value('(CI:Cas)[1]', 'varchar(20)'), 
    Chemical_Name = Ingred.value('(CI:ChemicalName)[1]', 'varchar(100)') 
FROM 
    @XmlTable 
CROSS APPLY 
    XMLData.nodes('/ArrayOfCatalogItem/CatalogItem/CI:Msds') AS XT(CI) 
CROSS APPLY 
    CI.nodes('CI:Ingredients') AS XT18(Ingred) 

을 나는 각 <Msds> 노드의 XML 조각의 목록을,이에서 나는 ProductIdentifiers을 잡아 정보. 또한이 노드에서 <Ingredients> 노드에 대한 하위 XML 조각 목록을 가져 와서 자세한 내용을 살펴 봅니다.

내 출력은 다음과 같습니다

enter image description here