在Xquery中,[1]的意义是什么?

4

我对SQL Server中的xquery不熟悉。

我经常遇到使用带有属性的[1]的xquery表达式。

请问有人能解释一下这是什么意思吗?

下面是一个例子

declare @aa xml
set @aa='<data>
  <row>
    <Value>1</Value>
    <Text>Masters</Text>
  </row>
  <row>
    <Value>2</Value>
    <Text>Transactions</Text>
  </row>
  <row>
    <Value>3</Value>
    <Text>Misch. Reports</Text>
  </row>
</data>'


select a.f.value('Value[1]','varchar(50)'),   --  why [1] here ?
   a.f.value('Text[1]','varchar(50)')         --  and here too..
 from @aa.nodes('/data/row') as a(f)

感谢和问候。

好问题 - 我一直以为它是一个索引(Value节点的第一次出现),但我不确定。 - JNK
肯定不是索引,否则它不会返回多行。 - Deb
答案似乎表明情况并非如此 :) 请记住,这是一个层次结构,因此我认为它意味着该树级别的第一个值节点。您可以多行,因此可以获得多个值。 - JNK
2
这是当前元素的索引。你使用了 from @aa.nodes('/data/row') as a(f),所以对于每一行,你基本上都有一个等于 row 元素的 .(或者说当前元素)。如果那个 row 元素有两个 Text 元素,你可以用 Text[2] 来获取第二个元素的值,这相当于 ./Text[2] - Jeremy Pridemore
2个回答

9
在XPath中,[expression]语法表示定位路径上的谓词[1]缩写语法,表示[position()=1],意思是“第一个元素”。在使用XPath的SQL Server中,需要使用[1](或任何其他确定性地过滤至多一个元素的谓词),因为它将XPath表达式从返回任意数量元素的表达式转换为确定性返回0个或1个元素的表达式,从而转换为标量表达式,这是.value()所需的内容:

XQuery最多只能返回一个值。


3
在这种情况下,您要获取当前 /data/row 的第一个 Value 元素以及同样的第一个 Text 元素。如果您在那里放置了一个 [2],那么它将意味着第二个元素。即使您知道只有一行,也可以在那里放置 [1],这样可以确保只有一个元素进入 value 函数。

这就是全部吗?没有其他原因吗? - Deb
你的意思是什么?没错,就是这样。因为你可能有<Root><Data>6</Data><Data>7</Data><Data>9</Data></Root>这样的数据,并且想在查询中获取第三个Data元素。所以[#]语法允许这样做。 - Jeremy Pridemore
我几乎被说服了,但仍在等待,如果有人有更多信息的话。 - Deb
然后看看Remus的答案,它更详细并且有参考资料。考虑将其标记为答案,因为它用更多的细节和更好的方式表达了相同的内容。 :) 编辑:看起来我说得太慢了 - Jeremy Pridemore

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接