我正在使用Server 2008 R2。我的问题是,我希望使用FLWOR计算从XQuery查询中获得的点击率。每次命中,我想要一个连续的数字,比如:0,1,2,3,4.
我的问题是:
select @xml.query('for $s at $count in /Root/Persons/Person
return <Person ID="{$count}">{$s}</Person>')这里唯一的问题是SQL Server中不支持这一点,并且我收到了一个错误:
Msg 9335, Level 16, State 1, Line 16
XQuery [query()]: The XQuery syntax 'at' is not supported.我也尝试过使用let关键字并定义了新变量,但是我不知道如何在每次迭代中增加该变量的值?
谢谢你的回答,弗伦奇
发布于 2013-09-10 11:39:31
XQuery是一种声明性语言, to increment a counter。
对于缺少的at特性,一个相当麻烦的解决方法是计算前面的兄弟级<person/>标记:
for $person in /Root/Persons/Person
let $count := count($person/preceding-sibling::Person) + 1
return <Person ID="{$count}">{$person}</Person>请注意,如果没有执行引擎优化(执行引擎可能不会优化),这段代码将具有O(n^2)运行时,因为前面重复的同级扫描。
编辑:正如注释中所述,MS甚至不支持preceding-sibling轴。不过,他们确实支持 node order comparison operator。应完全支持此查询:
for $person in /Root/Persons/Person
let $count := count($person/parent::Persons/Person[. << $person]) + 1
return <Person ID="{$count}">{$person}</Person>顺便说一句,你可能只想粘贴这个人的名字,所以最好用
(: snip :)
return <Person ID="{$count}">{data($person)}</Person>发布于 2014-09-23 13:56:06
如果您不太熟悉XQuery,另一种可能的公式可能更容易阅读:
for $i in (1 to count(/Root/Persons/Person))
let $person := /Root/Persons/Person[$i]
return
<Person ID="{$i}">{$person}</Person>另外,如果Server支持/曾经支持XQuery 3.0,那么您可以执行以下操作,这是相当不错的:
/Root/Persons/Person ! <Person ID="{position()}">{data(.)}</Person>https://stackoverflow.com/questions/18716350
复制相似问题