2009-04-16 5 views
1

Je pense que ce dont j'ai besoin est CROSS APPLY, mais je n'arrive pas à comprendre la syntaxe. J'ai un ensemble de XML dans une base de données MSSQL 2008 qui ressemble à ceci:Mixer les parents XML et les enfants dans MSSQL

<Cookie> 
    <id>Chocolate Chip</id> 
    <ChocolateChipPeanutButter> 
     ... 
    </ChocolateChipPeanutButter> 

    <ChocolateChipPecan> 
     ... 
    </ChocolateChipPecan> 
</Cookie> 

<Cookie> 
    <id>Raisin</id> 
</Cookie> 

<Cookie> 
    <id>Coconut</id> 
</Cookie> 

<Cookie> 
    <id>Sugar</id> 
</Cookie> 

Je suis en train de couper le XML pour que j'ai un jeu de résultats qui ressemble à ceci:

Cookie Name     Cookie SubName 
___________     ______________ 
Chocolate Chip    <null> 
Chocolate Chip    ChocolateChipPeanutButter 
Chocolate Chip    ChocolateChipPecan 
Raisin      <null> 
Coconut      <null> 
Sugar       <null> 

Je pense que je dois écrire quelque chose comme ceci (en supposant que les données XML sont stockées dans DECLARE @XMLData XML:

SELECT 
    TheXML.TheCookie.query('data(./id)')  AS CookieName 
    , TheXML.TheCookie.query('.')    AS CookieData 
    , Sub.SubCookieName      AS SubCookieName 
FROM 
    @XMLData.nodes('//Cookie') AS TheXML(TheCookie) 
CROSS APPLY 
    (
     SELECT 
      TheCookieXML.SubCookieName.query('local-name(.)') 
     FROM 
      CookieData.nodes('./*') AS TheCookieXML(SubCookieName) 
    ) 

Je sais, je sais, ce schéma XML est terrible pour ce que j'essaie de faire avec, mais supposons que nous sommes coincés avec les données de cette façon et travaillons à partir de là. Suis-je sur la bonne voie? Est-ce que CROSS APPLY fonctionnera jamais comme ça? Est-ce que Batman peut même me sauver maintenant?

+0

Prototype de Cookie maître 2010 Microsoft peut-être :-) –

Répondre

2

Essayez quelque chose comme ceci:

SELECT 
    TheXML.TheCookie.value('(id[1])', 'varchar(20)') AS CookieName 
    , TheXML.TheCookie.query('.') AS CookieData 
    , Sub.SubCookie.value('local-name(.)', 'varchar(20)') AS SubCookieName 
FROM 
    @xmlcon.nodes('//Cookie') AS TheXML(TheCookie) 
CROSS APPLY 
    TheXML.TheCookie.nodes('./*') as Sub(SubCookie) 

Le problème est - ce sélectionne aussi le "id" noeud :-(

Marc

+0

? TheXML.TheCookie.nodes ('./* [nom-local()! =' Id ']) comme Sub (SubCookie) – Tomalak

+0

parfait, merci les gars! – brian

+2

Troisième tentative d'un commentaire ... Ce qui précède contient quelques pépins de guillemets simples, rien de grave. Alternative, plus simple XPath: TheXML.TheCookie.nodes ('./* [not (self :: id)]') – Tomalak

Questions connexes