是否有人能够解释为什么两个结果不同,即使节点XML表示完全相同?
declare @t varchar(max) set @t = '<a><b><c/></b><d>eeee</d></a>'
declare @x xml set @x = cast(@t as xml)
select N.query('.'), N.value('local-name(.)','varchar(max)')+'.' from @x.nodes('//*') T(N)
select N.query('.'), N.value('local-name(.)','varchar(max)')+'.' from @x.nodes('/') T(N)
结果1:
Col1 Col2
<a><b><c /></b><d>eeee</d></a> a.
<b><c /></b> b.
<c /> c.
<d>eeee</d> d.
结果2:
Col1 Col2
<a><b><c /></b><d>eeee</d></a> .
此查询更清楚(相对而言)显示正在发生的事情:
declare @t varchar(max) set @t = '<a><b><c/></b><d>eeee</d></a><x />'
declare @x xml set @x = cast(@t as xml)
select N.query('.'), N.value('local-name(.)','varchar(max)')+'.' from @x.nodes('//*') T(N)
select N.query('.'), N.value('local-name(.)','varchar(max)')+'.' from @x.nodes('/*') T(N)
select N.query('.'), N.value('local-name(.)','varchar(max)')+'.' from @x.nodes('/') T(N)
结果1:
Col1 Col2
<a><b><c /></b><d>eeee</d></a> a.
<b><c /></b> b.
<c /> c.
<d>eeee</d> d.
结果2:
Col1 Col2
<a><b><c /></b><d>eeee</d></a> a.
<x /> x.
Result3:
Col1 Col2
<a><b><c /></b><d>eeee</d></a><x /> .
所以在最初的问题中,即使结果1和2中的XML在视觉上是相同的,它们也是“不同的”。
答案 0 :(得分:3)
'/'
从根节点
'//'
从当前节点中选择与选择匹配的文档中的节点,无论它们在何处。
查询1匹配所有根元素。
查询2与文档根目录下的单个元素匹配。文档根目录没有名称。