2010-07-30 19 views
0

Étant donné le code XML suivant (champ dans une colonne SQL appelée 'xField'):XML pivot en utilisant XQuery et filtre sur l'attribut

<data> 
    <section> 
    <item id="A"> 
     <number>987</number> 
    </item> 
    <item id="B"> 
     <number>654</number> 
    </item> 
    <item id="C"> 
     <number>321</number> 
    </item> 
    </section> 
    <section> 
    <item id="A"> 
     <number>123</number> 
    </item> 
    <item id="B"> 
     <number>456</number> 
    </item> 
    <item id="C"> 
     <number>789</number> 
    </item> 
    </section> 
</data> 

Comment obtenir-vous la structure de tableau ci-dessous (A, B & C comme les noms de colonnes):

A | B | C 
987|654|321 
123|456|789 

Utilisation XQuery SQL, j'essaie ceci (sans surprise, il est invalide):

SELECT 
    data.value('(./section/item[@ID = "A"]/number/[1])', 'int') as A, 
    data.value('(./section/item[@ID = "B"]/number/[1])', 'int') as B, 
    data.value('(./section/item[@ID = "C"]/number/[1])', 'int') as C 
FROM Table CROSS APPLY [xfield].nodes('/data') t(data) 

Répondre

3

Vous y êtes presque.

Vous devez utiliser nodes() pour déchiqueter le xml dans les lignes que vous voulez travailler avec - ici, vous voulez une ligne de ResultSet pour chaque élément section, donc déchiqueter avec

nodes('/data/section') 

Une fois que vous avez fait cela, il vous suffit de faire votre XPath [1] syntaxiquement correct (et par rapport aux section nœuds vous serez « in »):

data.value('(item[@id = "A"]/number)[1]', 'int') as A, 
data.value('(item[@id = "B"]/number)[1]', 'int') as B, 
data.value('(item[@id = "C"]/number)[1]', 'int') as C 

et le tour est joué:

A   B   C 
----------- ----------- ----------- 
987   654   321 
123   456   789 
+0

Merci! Ce sont les bits manquants. – grenade