2012-12-16 72 views
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

回答

1

通常你會使用動態標籤名稱元素建設,但SQL Server不支持此:

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 element { local-name($e) } { $e/@* } </xx>') as Attr 
from @x.nodes('//*') as T(c); 

作爲XQuery更新替代(與SQL Server 2012測試),我們可以獲取所有節點(包括所有內容),並刪除其subnotes。

DECLARE @x xml = '<doc>test 
    <apple type="bramley"> tasty <b>yum!</b> </apple> 
    <banana color="yellow" shape="bendy"> nice in smoothies </banana> 
</doc>'; 

-- Fetch all nodes 
SET @x = @x.query('//*') 
-- Delete all subnodes 
SET @x.modify('delete /*/node()') 

select 
    c.query('.') as NewNode 
from @x.nodes('/*') as T(c); 
+0

謝謝!我今天晚些時候會試一試 – Ubercoder

+0

好的我在SQL Server中試過它,但它不喜歡它 - 錯誤是_只有常量表達式支持計算元素和屬性構造函數的名稱表達式。所以我認爲** local-name($ e)**不允許作爲SQL服務器中的一個元素構造函數(這使得元素構造函數在SQL Server中不是很有用,但那是另一回事)。有沒有我可以測試的XQuery的其他變體? – Ubercoder

+0

似乎是一個真正的問題。 [有另一個問題的答案](http://stackoverflow.com/a/4418821/695343),它使用字符串連接來構建XML - 看起來真的很難看。 「如果這種做法是冒犯性的,你現在可以停止閱讀:)」......更好地從更高層次看待你的問題;你試圖解決什麼是你的實際問題? –