2012-01-19 168 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叶。