2010-03-01 11 views
3

utilisant MSSQL 2008 et XQueryComment convertir la hiérarchie imbriquée de xml à table SQL

Tenir compte le code XML suivant stocké dans une table:

<ROOT> 
    <WrapperElement> 
    <ParentElement ID=1> 
     <Title>parent1</Title> 
     <Description /> 
     <ChildElement ID="6"> 
     <Title>Child 4</Title> 
     <Description /> 
     <StartDate>2010-01-25T00:00:00</StartDate> 
     <EndDate>2010-01-25T00:00:00</EndDate> 
     </ChildElement> 
     <ChildElement ID="0"> 
     <Title>Child1</Title> 
     <Description /> 
     <StartDate>2010-01-25T00:00:00</StartDate> 
     <EndDate>2010-01-25T00:00:00</EndDate> 
     </ChildElement> 
     <ChildElement ID="8"> 
     <Title>Child6</Title> 
     <Description /> 
     <StartDate>2010-01-25T00:00:00</StartDate> 
     <EndDate>2010-01-25T00:00:00</EndDate> 
     </ChildElement> 
    </ParentElement> 
    </WrapperElement> 
</Root> 

Je veux décomposer ce xml en quelque chose comme

PE!ID | PE!Title | PE!Description | CE!ID | CE!Title | CE!StartDate |... 
1  | parent1 |    | 6  | child 4 | 2010-... | 
1  | parent1 |    | 0  | child1 | 2010-... | 

etc.

note: il peut y avoir beaucoup de ChildElements par parentElement, dans cet e xample. J'ai expérimenté avec xquery mais je n'ai pas été capable de naviguer à travers des éléments complexes en tant que tels. Fondamentalement, j'essaye de faire exactement le contraire de ce que FOR XML fait à une table, seulement avec un ensemble de données beaucoup plus simpliste pour travailler avec.

Des idées sur où aller ensuite ou comment accomplir cela?

Merci

+0

Le code XML est-il stocké à l'aide d'un type de données text (varchar/etc) ou XML? –

Répondre

6

Que diriez-vous cela (je déclarai @input être une variable de type XML avec votre contenu XML - remplacer en conséquence):

SELECT 
    Parent.Elm.value('(@ID)[1]', 'int') AS 'ID', 
    Parent.Elm.value('(Title)[1]', 'varchar(100)') AS 'Title', 
    Parent.Elm.value('(Description)[1]', 'varchar(100)') AS 'Description', 
    Child.Elm.value('(@ID)[1]', 'int') AS 'ChildID', 
    Child.Elm.value('(Title)[1]', 'varchar(100)') AS 'ChildTitle', 
    Child.Elm.value('(StartDate)[1]', 'DATETIME') AS 'StartDate', 
    Child.Elm.value('(EndDate)[1]', 'DATETIME') AS 'EndDate' 
FROM 
    @input.nodes('/ROOT/WrapperElement/ParentElement') AS Parent(Elm) 
CROSS APPLY 
    Parent.Elm.nodes('ChildElement') AS Child(Elm) 

Vous itérer essentiellement sur tous les /ROOT/WrapperElement/ParentElemet noeuds (comme Parent(Elm) pseudo table), et pour chacune de ces entrées, vous faites ensuite CROSS APPLY pour les éléments enfants contenus à l'intérieur de ce ParentElement et récupérez les informations nécessaires.

Devrait fonctionner - j'espère!

Questions connexes