2014-04-24 29 views
1

我在SQL Server中(XML類型的列)一些XML有些看起來像這樣查詢XML片段在SQL Server中,無論XML樹深度

<TreeRoot> 
    <Node id="12" name="name2"> 
    <Node id="54" name="name4654"> 
     <Node id="75" name="name0943> 
     <Node id="58" name="dfd2"> 
     </Node> 
     </Node> 
     <Node id="43" name="543d32"> 
     </Node> 
    </Node> 
    </Node> 
</TreeRoot> 

我試圖設計出了這個XML的查詢會給我所有的節點ID和節點名稱的列表,像這樣:

Name  Id 
----------- 
name2 12 
name4654 54 
name0943 57 
dfd2  58 
543d32 43 

我有一個查詢已經做這個工作 - 但它是硬編碼到樹,這意味着我需要的特定水平在將節點添加到xml片段時更新此查詢。

有沒有一種方法來構建一個XPath查詢,它會給我這個列表 - 並且足夠健壯,可以處理將來的額外級別?

感謝,

:-)

/加斯帕 哥本哈根,丹麥

回答

2

如何:

DECLARE @XmlTable TABLE (ID INT NOT NULL, XmlData XML) 

INSERT INTO @XmlTable 
     (ID, XmlData) 
VALUES 
     (1, '<TreeRoot> 
    <Node id="12" name="name2"> 
    <Node id="54" name="name4654"> 
     <Node id="75" name="name0943"> 
     <Node id="58" name="dfd2"> 
     </Node> 
     </Node> 
     <Node id="43" name="543d32"> 
     </Node> 
    </Node> 
    </Node> 
</TreeRoot>') 

SELECT 
    NodeName = XC.value('@name', 'varchar(50)'), 
    NodeID = XC.value('@id', 'int') 
FROM @XmlTable 
CROSS APPLY XmlData.nodes('//Node') AS XT(XC) 

給我你要找的輸出。在他們居住的XML樹無論在哪裏 -

基本上,.nodes()將返回對應於呼叫的XPath表達式XML片段的「虛擬」表 - 和//Node將選擇所有<Node>元素。不知道這是否會在大型XML結構上超快 - 但它應該工作。