2012-01-19 164 views
1

更多的反映出一個問題。我創建一個存儲過程,它將xml作爲輸入參數,並在查詢數據時遇到一些問題。存儲過程xml查詢

這是查詢

DECLARE @xVar XML 
SET @xVar = 
    '<?xml version="1.0"?> 
<Workflow xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://ait.com/workflow/"> 
    <Users> 
    <User ObjectId="1232"> 
     <UserId>123</UserId> 
    </User> 
    <User ObjectId="1232"> 
     <UserId>124</UserId> 
    </User> 
    </Users> 
</Workflow>'; 


WITH XMLNAMESPACES(DEFAULT 'http://ait.com/workflow/') 
SELECT [UserId] = reportdata.item.value('UserId[1]', 'varchar(36)') 

FROM @xVar.nodes('//Workflow/Users/User') AS reportdata(item) 

這只是返回的用戶ID的XML文檔中的一個。如果我走在SELECT語句

FROM @xVar.nodes('//Workflow/Users/User') AS reportdata(item) 

它的工作原理和似乎是合乎邏輯的最後一部分仔細看,從根開始,並指定路徑,有什麼奇怪,我的是,這也適用

FROM @xVar.nodes('//Users/User') AS reportdata(item) 

,甚至陌生人,這個工作

FROM @xVar.nodes('//User') AS reportdata(item) 

可能錯過了一些頁面的XML書傻瓜,可能有人賜教請

回答

1

//意味着它會給你所有與表達式相匹配的後代節點。

這個//Workflow/Users/User並不意味着「從根開始」。與根匹配的表達式如下所示/Workflow/Users/User

因此//User會給你所有的後代用戶節點,無論他們在哪裏。再次

Value 
----------- 
1 
2 
3 

(3 row(s) affected) 

Value 
----------- 

(0 row(s) affected) 

Value 
----------- 
1 
2 

(2 row(s) affected) 
+0

感謝:

試試這個:

declare @XML xml = '<root> <user>1</user> <user>2</user> <child> <user>3</user> </child> </root>' select T.N.value('.', 'int') as Value from @XML.nodes('//user') as T(N) select T.N.value('.', 'int') as Value from @XML.nodes('/user') as T(N) select T.N.value('.', 'int') as Value from @XML.nodes('/root/user') as T(N) 

結果。像你的答案教學,徹底和尊重。幹得好 – klashagelqvist

+0

不客氣。 –

0

這並不奇怪。

它所做的是搜索所有xml樹,直到找到預期的User葉。