Sql server中的FLWOR计数命中数

Fre*_*kyB 4 xquery sql-server-2008-r2 xquery-sql flwor

我正在使用SQL 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>')
Run Code Online (Sandbox Code Playgroud)

这里唯一的问题是SQL Server不支持这个问题,我收到一个错误:

Msg 9335, Level 16, State 1, Line 16
XQuery [query()]: The XQuery syntax 'at' is not supported.
Run Code Online (Sandbox Code Playgroud)

我也尝试过let关键字并定义新变量,但我不知道如何在每次迭代时增加该变量的值?

感谢所有答案,弗伦基

Jen*_*rat 5

XQuery是一种声明性语言,不能用于let递增计数器.

对缺失at特征的一个相当hackish的解决方法是计算前面的兄弟<person/>标记:

for $person in /Root/Persons/Person
let $count := count($person/preceding-sibling::Person) + 1
return <Person ID="{$count}">{$person}</Person>
Run Code Online (Sandbox Code Playgroud)

请注意,O(n^2)如果未执行引擎(可能不会执行此操作)优化此代码将具有运行时,因为重复的先前兄弟扫描.


编辑:如评论中所述,MS SQL甚至不支持preceding-sibling轴.但它们确实支持<<节点顺序比较运算符.应完全支持此查询:

for $person in /Root/Persons/Person
let $count := count($person/parent::Persons/Person[. << $person]) + 1
return <Person ID="{$count}">{$person}</Person>
Run Code Online (Sandbox Code Playgroud)

顺便说一下,你可能只想粘贴这个人的名字,这样可以更好地使用

(: snip :)
return <Person ID="{$count}">{data($person)}</Person>
Run Code Online (Sandbox Code Playgroud)