2014-01-22 106 views
1

我有一個類型爲varchar(max)的列填充了xml節點和值;作爲示例,列數據以<tag1> <tag2>value1</tag2><tag3>value2</tag3>... </tag1>開頭。我需要使用靜態SQL或存儲過程爲表中的每一行在一個單元格中使用「value1 value2 value3 ... valueN」。節點樹不總是相同的,有時路徑是<tagX><tagY>valueY</tagY>...</tagX>檢索多個XML子節點值

我所有使用粉碎xml的經驗僅用於獲取一個特定的值,屬性或標記,而不是所有的值,同時保留列和行數。目前我查詢,然後遍歷產品結尾的結果集並將所有內容切碎,但由於最近的變化,這不再是一種選擇。

可以將列更改爲xml類型,但如果可能的話,我想避免這樣做。

+0

你能展示一些數據和你有什麼到目前爲止已經試過??? –

+0

我無法顯示任何數據,因爲它是PCI。 我試過聲明一個xml變量,並將其設置爲列數據(打算循環並切碎,但它包含字符'<' and '>'),但是因爲我需要在列中的所有行上執行此操作在其中存儲多個值。我已經考慮過modify(),但是由於節點路徑的變量性質,刪除和值都不起作用,因爲我需要提供一個設置路徑(並且delete不保留值)。我對xml的體驗相當有限,所以我不知道其他可能的解決方案。 –

回答

1

將該列轉換爲XML(或將其在表中更改爲XML),然後碎片//*上的xml以獲取表中的所有節點。然後您可以使用for xml path將數值連接在一起。

select (
     select ' '+X.N.value('text()[1]', 'varchar(max)') 
     from (select cast(T.XMLCol as xml)) as T1(XMLCol) 
     cross apply T1.XMLCol.nodes('//*') as X(N) 
     for xml path(''), type 
     ).value('substring(text()[1], 2)', 'varchar(max)') 
from T 

SQL Fiddle

+0

這樣做,謝謝! –