2010-10-15 7 views
1

J'ai un scénario dans lequel je veux obtenir les nœuds distincts à partir de XML.Comment puis-je obtenir des nœuds xml distincts à l'aide d'une requête dans SQL Server 2008

Donc, si j'ai XML:

<person> 
<age> 
    <year value="2010"/> 
    <month value="10"/> 
    <day value="21"/> 
</age> 
<age> 
    <year value="2011"/> 
    <month value="11"/> 
    <day value="4"/> 
</age> 
</person> 

Comment pourrais-je récupérer dans les résultats:

person 
age 
year 
month 
day 

Est-ce possible? Je jouais avec nodes.query et nodes.value, mais je n'arrivais pas à comprendre comment extraire les valeurs de nœuds?

Merci,

S

+0

Je ne comprends pas ce que vous voulez ici. Vous voulez juste le nom des éléments et ne vous souciez pas des valeurs? Voilà à quoi il ressemble à partir de vos résultats souhaités. –

+0

Oui, c'est correct. Je sais que c'est étrange, mais j'espère utiliser ceux-ci pour me donner la possibilité de faire des comptes de noeuds dans le XML dynamiquement. Donc, je peux utiliser cette information pour fournir des comptes sur chacun des éléments dans le XML, puis l'utiliser dans une requête. – scarpacci

+0

J'essaye de comprendre comment je pourrais construire un appel dynamique pour compter les noeuds sans devoir réellement construire une requête dynamique. Donc, si je peux exposer les comptes de chacun des éléments, alors je pourrais l'utiliser dans une clause where. – scarpacci

Répondre

2
DECLARE @person XML 
SELECT @person = CAST(' 
    <person> 
     <age> 
      <year value="2010"/> 
      <month value="10"/> 
      <day value="21"/> 
     </age> 
     <age> 
      <year value="2011"/> 
      <month value="11"/> 
      <day value="4"/> 
     </age> 
    </person>' AS XML) 

;WITH nodeData AS (
    SELECT 
     node.value('local-name(.)', 'NVARCHAR(MAX)') AS nodeName, 
     node.query('.') AS nodeInstance 
    FROM @person.nodes('/*') a(node) 
    UNION ALL 
    SELECT 
     node.value('local-name(.)', 'NVARCHAR(MAX)'), 
     node.query('.') 
    FROM nodeData 
    CROSS APPLY nodeInstance.nodes('/*/*') b(node) 
) 
SELECT nodeName, COUNT(nodeName) AS nodeCount FROM nodeData 
GROUP BY nodeName 
ORDER BY nodeCount DESC 
+0

Génial ... c'est parfait! – scarpacci

+0

Ceci est de l'argent parce que maintenant je ne dois pas faire – scarpacci

Questions connexes