Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

CROSS APPLY auf Namensraum, Unterknoten gibt doppelte Datensätze zurück

Versuchen Sie Folgendes:

;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)

Ich erhalte eine Liste von XML-Fragmenten für jeden <Msds> Knoten, und von diesem hole ich mir die ProductIdentifiers die Info. Außerdem erhalte ich von diesem Knoten auch eine Liste von Sub-XML-Fragmenten für <Ingredients> Knoten, und greifen Sie von diesen detailliert darauf zu.

Meine Ausgabe sieht so aus: