2010-04-19 3 views
0

J'ai une colonne XML qui contient XML comme ceci:shreding colonne xml

<Set> 
    <Element> 
     <ID> 
      1 
     </ID> 
<List> 
    <ListElement> 
     <Part1> 
      ListElement 1 
     </Part1> 
    </ListElement> 
    <ListElement> 
     <Part1> 
      ListElement2 
     </Part1> 
    </ListElement> 
</List> 
    </Element> 
    <Element> 
     <ID> 
      2 
     </ID> 
<List> 
    <ListElement> 
     <Part1> 
      ListElement3 
     </Part1> 
    </ListElement> 
    <ListElement> 
     <Part1> 
      ListElement4 
     </Part1> 
    </ListElement> 
</List> 
    </Element> 
</Set> 

Je voudrais déchiqueter ceci dans une table de relation contenant ceci:

ID, ListElement 
1, ListElement1 
1, ListElement2 
2, ListElement3 
2, ListElement4 

Je suis en mesure d'obtenir le le contenu des pièces en utilisant quelque chose comme ceci:

select  
    List.value('(Part1/text())[1]', 'varchar(max)') as test 
from 
    Table CROSS APPLY 
     xml.nodes('// Element/List/ListElement') AS List(List) 

mais je ne l'ai pas encore atteint de garder le (la valeur d'ID) « clé étrangère ».

Merci.

Meilleurs voeux,

Christian

Répondre

0

Essayez ceci au lieu de votre requête:

SELECT  
    List.value('(../../ID)[1]', 'int') AS 'ID', 
    List.value('(Part1/text())[1]', 'varchar(max)') as test 
FROM 
    dbo.Table 
CROSS APPLY 
    xml.nodes('/Set/Element/List/ListElement') AS List(List) 

Mise à jour à nouveau - maintenant à une seule CROSS APPLY, remontant vers le haut dans « ID de grand parent "élément utilisant ../../ID dans XPath. En outre éliminé le //Element XPath en faveur de /Set/Element (les //Element XPath sont notoirement lent)

+0

Les espaces blancs sont là pour donner une belle apparence à cette question - ceci est juste à titre illustratif. ses. J'ai aussi besoin d'une application croisée. @tmp ne fonctionnerait pas car j'ai plusieurs lignes de choses ci-dessus. – cs0815

+0

J'ai essayé ceci et cela ne fonctionne pas. Il identifie tous les ID d'une ligne mais renvoie null pour le test. Il ne peut pas fonctionner car il renvoie uniquement les n ID de chaque élément. Cependant chaque ELEMENT a y ListElements! Donc, le nombre de lignes retournées devrait être beaucoup plus grand que n! Fondamentalement, il y a un realtionhsip m-à-m entre Element et ListElement - c'est le défi et j'espère que cela a du sens. – cs0815

+0

Salut. Merci, cela semble beaucoup mieux. J'essaie actuellement d'utiliser: Parent.Node.nodes ('/ List/ListElement') AS Liste (Liste) au lieu de Parent.Node.nodes ('List/ListElement') AS Liste (Liste) parce que ce dernier ne fonctionne pas. Cela semble fonctionner mais j'attends toujours - il semble prendre des âges ... – cs0815

0

Dans le cas où quelqu'un veut faire avec XQuery:

 

<Table> 
    {for $listElement in $table//ListElement 
    return 
     <Row> 
     {$listElement/../../ID} 
     {$listElement/Part1} 
     </Row>  
    } 
</Table> 
 

où $ table est le XML

retours d'origine

<Table> 
    <Row> 
     <ID> 1 </ID> 
     <Part1> ListElement 1 </Part1> 
    </Row> 
    <Row> 
     <ID> 1 </ID> 
     <Part1> ListElement2 </Part1> 
    </Row> 
    <Row> 
     <ID> 2 </ID> 
     <Part1> ListElement3 </Part1> 
    </Row> 
    <Row> 
     <ID> 2 </ID> 
     <Part1> ListElement4 </Part1> 
    </Row> 
</Table> 
Questions connexes