2010-10-15 57 views
1

我有一個場景,我想從XML獲取不同的節點。如何在SQL Server 2008中使用查詢來獲取不同的xml節點

所以,如果我有這樣的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> 

我怎麼能檢索結果:

person 
age 
year 
month 
day 

這可能嗎?我正在玩nodes.query和nodes.value,但我似乎無法弄清楚如何提取實際的節點值?

感謝,

小號

+0

我不明白你想要的這裏。你只是想要元素的名稱,不關心值?這就是你想要的結果。 – 2010-10-15 22:45:20

+0

是的,這是正確的。我知道這很奇怪,但我希望能夠使用這些來讓我能夠動態地在XML中執行節點計數。因此,我可以使用這些信息來提供XML中每個元素的計數,然後在查詢中使用這些信息。 – scarpacci 2010-10-15 22:57:41

+0

我想弄清楚如何構建一個動態調用來計算節點而不必實際構建動態查詢。因此,如果我可以公開每個元素的計數,那麼我可以在where子句中使用它。 – scarpacci 2010-10-15 22:58:52

回答

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

真棒....這是完美的! – scarpacci 2010-10-16 00:30:18

+0

這是錢,因爲現在我不必製造th – scarpacci 2010-10-16 00:32:40

相關問題