2013-04-18 1 views
1

J'essaie d'importer des données à partir d'un fichier XML assez volumineux vers un serveur SQL. Après quelques recherches en ligne, j'ai décidé d'utiliser OpenXML. La requête que j'ai à ce jour estComment accéder aux éléments imbriqués en XML avec OpenXML

DECLARE @doc INT 
DECLARE @xml XML 
SELECT @xml = evnt 
FROM OPENROWSET (BULK 'c:\archive.xml', SINGLE_BLOB) AS Import(evnt) 

EXEC sp_xml_preparedocument @doc OUTPUT, @xml 

SELECT * 
FROM OPENXML(@doc, '/Events/eventData/event', 2) 
WITH (
    id varchar(max) 
) 
EXEC sp_xml_removedocument @doc 

De cette façon, je suis en mesure d'obtenir des éléments énumérés dans « événement », mais comment pourrais-je obtenir un élément d'un niveau plus bas de « événement ». Par exemple, comment aurais-je l'étiquette 'CustId' ci-dessous? Les éléments à l'intérieur de 'event' sont principalement nécessaires, d'où le chemin ne peut être changé. Aussi d'autres approches seraient bien aussi. J'en ai besoin pour fonctionner à partir de SQL Server, donc je ne peux pas utiliser SSIS ou d'autres outils externes similaires. XQuery semble prendre beaucoup de temps.

J'utilise SQL Server 2008 R2

+0

Pourquoi avez-vous choisi OpenXML à la place du support natif XQuery SQL Server? Semble beaucoup plus facile à utiliser et plus flexible ... –

+0

Je lis dans beaucoup d'endroits qu'OpenXML est meilleur avec des fichiers plus grands, bien qu'il soit très intensif en mémoire. Les fichiers à analyser peuvent facilement dépasser 100 Mo. – Ryez

Répondre

1

Si quelqu'un est intéressé la solution à la question ci-dessus était assez simple.

SELECT * 
FROM OPENXML(@doc, '/Events/eventData/event') 
WITH (
    ID varchar(max) 'id' 
    CustID varchar(20) 'customAttribute/CustId', 
    AttributeID varchar(20) '@id' 
    SampleID varhcar(20) 'Ele1/Ele2[3]/id' 
) 

Les valeurs entre guillemets doivent correspondre exactement au nom du document XML. '@' est utilisé pour sélectionner les attributs dans l'élément. Revenir à un niveau est fait avec '../'.

Le ID_échant récupère « id » dans le troisième élément « Ele2 » intérieur « ELE1 »

Questions connexes