2010-07-06 4 views
3

J'ai ce XML dans T-SQL:XML dans Aplatissement SQLXML

<Elements> 
    <Element> 
     <Index>1</Index> 
     <Type>A</Type> 
     <Code>AB</Code> 
     <Time>1900-01-01T10:21:00</Time> 
    </Element> 
    <Element> 
     <Index>2</Index> 
     <Type>M</Type> 
     <Code>AL</Code> 
     <Time>1900-01-01T10:22:00</Time> 
    </Element> 
</Elements> 

Et je veux le récupérer comme une table:

Index FieldName FieldValue 
-------- ------------ ---------- 
1  Index  1 
1  Type   A 
1  Code   AB 
1  Time   1900-01-01T10:21:00 
2  Index  2 
2  Type   M 
2  Code   AL 
2  Time   1900-01-01T10:22:00 

Bien sûr, ce que je cherche ici est de faire pivoter les noeuds d'élément en lignes, mais je ne peux pas obtenir plus que la valeur du champ ou de l'indice à un moment ...

select 
-- r.value('.[1]', 'nvarchar(10)') Value, 
-- r.value('fn:local-name(.)', 'nvarchar(50)') FieldName 
    r.value('Index[1]', 'nvarchar(10)') f, 
    r.value('./node()[fn:local-name(.)]', 'nvarchar(10)') v 
from 
    @content.nodes('/Elements/*') as records(r) 

Répondre

3

Vous pouvez essayer quelque chose comme ceci:

SELECT 
    El.Elem.value('(Index)[1]', 'int'), 
    SubEl.SubElem.value('local-name(.)', 'varchar(100)') AS 'Field Name', 
    SubEl.SubElem.value('.', 'varchar(100)') AS 'Field Value' 
FROM 
    @content.nodes('/Elements/Element') AS El(elem) 
CROSS APPLY 
    El.Elem.nodes('*') AS SubEl(SubElem) 

Cela semble produire votre sortie désirée dans mon cas de test.

Vous devez essentiellement pour sélectionner tous /Elements/Element nœuds dans une première étape, obtenir leur valeur d'index, puis dans une deuxième étape, sélectionnez tous les nœuds enfants (/*) pour un nœud <Element> donné.

+0

Parfait! Je vous remercie! :) –

+0

Je viens de virer un peu: O WH SubEl.SubElem.value ('nom-local (.)', 'Varchar (100)') <> 'Index' –

Questions connexes