2011-07-21 34 views
0

我在SQL服務器中有一個表,名稱爲[QueryResult],其中的類型爲Init,類型爲XML。如何在SQL Server中編寫xquery以讀取表中XML數據列的所有子節點?

以下是結果列數據的示例XML。

<OUTPUT> 
<item> 
    <VALUE001>2023038.09</VALUE001> 
    <VALUE002>265127.97</VALUE002> 
    <VALUE003>459868.86</VALUE003> 
    <VALUE004>16000.01</VALUE004> 
    <VALUE005>552010.15</VALUE005> 
    <VALUE006>21404.96</VALUE006> 
<item> 
<item> 
    <VALUE001>15655501.89</VALUE001> 
    <VALUE002>17172.50</VALUE002> 
    <VALUE003>8345.31</VALUE003> 
    <VALUE004>-117264374.12</VALUE004> 
    <VALUE005>-160893.48</VALUE005> 
</item> 
</OUTPUT> 

我需要如下返回輸出的查詢:

id  Element   Value 
----------------------------------- 
1 VALUE001  2023038.09 
2 VALUE001 2023038.09 
3 VALUE002 265127.97 
4 VALUE003 459868.86 
5 VALUE004 16000.01 
6 VALUE005 552010.15 
7 VALUE006 21404.96 
8 VALUE001 15655501.89 
9 VALUE002 17172.50 
10 VALUE003 8345.31 
11 VALUE004 -117264374.12 
12 VALUE005 -160893.48 

讓我知道如果這個問題不清楚嗎?

+0

在關於我們的賞金系統的[faq#bounty]中閱讀本節。 – Will

回答

1

這裏有一個解決方案:

DECLARE @xml XML = 
' 
<OUTPUT> 
<item> 
    <VALUE001>2023038.09</VALUE001> 
    <VALUE002>265127.97</VALUE002> 
    <VALUE003>459868.86</VALUE003> 
    <VALUE004>16000.01</VALUE004> 
    <VALUE005>552010.15</VALUE005> 
    <VALUE006>21404.96</VALUE006> 
</item> 
<item> 
    <VALUE001>15655501.89</VALUE001> 
    <VALUE002>17172.50</VALUE002> 
    <VALUE003>8345.31</VALUE003> 
    <VALUE004>-117264374.12</VALUE004> 
    <VALUE005>-160893.48</VALUE005> 
</item> 
</OUTPUT> 
' 

SELECT T.c.value('local-name(.)[1]', 'varchar(100)') AS Element, 
     T.c.value('./text()[1]', 'decimal(17,2)') AS Value 
FROM @xml.nodes('//item/child::node()') T(c); 

返回節點的順序位置比它看起來更困難。 This question提出了一個解決方案,但我沒有在這裏實現它,因爲它有點破解。

+0

這絕對完美!謝謝哈珀。 ('local-name(。)[1]','varchar(100)')AS元素, Tcvalue('./ text ()[1] ' 'VARCHAR(100)')AS值 \t \t FROM QR dbo.QueryResult WITH(NOLOCK) \t \t \t \t \t \t \t CROSS APPLY Result.nodes(' // OUTPUT /項目/子:: node()')AS T(c) – Charan

相關問題