SQL Server XML local-name()异常

时间:2011-09-30 02:52:37

标签: sql-server xml

是否有人能够解释为什么两个结果不同,即使节点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在视觉上是相同的,它们也是“不同的”。

  1. 第一个是从“root”
  2. 的(虚拟)位置开始的XML节点
  3. 第二个具有“虚拟根”,它是一个“文档”元素,不能直观显示。

1 个答案:

答案 0 :(得分:3)

'/'从根节点

中选择

'//'从当前节点中选择与选择匹配的文档中的节点,无论它们在何处。

查询1匹配所有根元素。

查询2与文档根目录下的单个元素匹配。文档根目录没有名称。