6
我正在使用SQL Server 2008,我想檢索XML元素並返回元素本身及其屬性,但沒有任何子元素,也沒有文本()。例如,下面的XML有4個節點(DOC,蘋果,B,香蕉):在SQL Server中檢索沒有子元素的元素
<doc>
<apple type="bramley"> tasty <b>yum!</b> </apple>
<banana color="yellow" shape="bendy"> nice in smoothies </banana>
</doc>
我想回:
<doc/>
<apple type="bramley"/>
<b/>
<banana color="yellow" shape="bendy"/>
例如DOC應該沒有任何的子節點和返回蘋果應該返回沒有b子節點。但問題是,如果我使用SQL Server節點和查詢方法,我無法刪除子節點。使用SQL Server 2008我最接近的是:
declare @x xml = '<doc>
<apple type="bramley"> tasty <b>yum!</b> </apple>
<banana color="yellow" shape="bendy"> nice in smoothies </banana>
</doc>';
select
c.query('local-name(.)') as Node,
c.query('for $e in . return <xx> {$e/@*} </xx>') as Attr
from @x.nodes('//*') as T(c);
這得到每個節點的名稱(使用本地名)和節點的屬性和回報:
Node Attr
---- ----
doc <xx />
apple <xx type="bramley" />
b <xx />
banana <xx color="yellow" shape="bendy" />
我意識到我可以處理此結果,將Attr轉換爲varchar,將Node替換爲xx並轉換回XML。但是,沒有字符串操作有沒有更簡單的方法?
PS:如果有幫助,如果解決方案使用SQL Server 2008或SQL Server我不介意2012
謝謝!我今天晚些時候會試一試 – Ubercoder
好的我在SQL Server中試過它,但它不喜歡它 - 錯誤是_只有常量表達式支持計算元素和屬性構造函數的名稱表達式。所以我認爲** local-name($ e)**不允許作爲SQL服務器中的一個元素構造函數(這使得元素構造函數在SQL Server中不是很有用,但那是另一回事)。有沒有我可以測試的XQuery的其他變體? – Ubercoder
似乎是一個真正的問題。 [有另一個問題的答案](http://stackoverflow.com/a/4418821/695343),它使用字符串連接來構建XML - 看起來真的很難看。 「如果這種做法是冒犯性的,你現在可以停止閱讀:)」......更好地從更高層次看待你的問題;你試圖解決什麼是你的實際問題? –