首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Sql server中的FLWOR计数命中次数

Sql server中的FLWOR计数命中次数
EN

Stack Overflow用户
提问于 2013-09-10 10:22:26
回答 2查看 1.4K关注 0票数 6

我正在使用Server 2008 R2。我的问题是,我希望使用FLWOR计算从XQuery查询中获得的点击率。每次命中,我想要一个连续的数字,比如:0,1,2,3,4.

我的问题是:

代码语言:javascript
复制
select @xml.query('for $s at $count in /Root/Persons/Person
return <Person ID="{$count}">{$s}</Person>')

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

代码语言:javascript
复制
Msg 9335, Level 16, State 1, Line 16
XQuery [query()]: The XQuery syntax 'at' is not supported.

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

谢谢你的回答,弗伦奇

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-10 11:39:31

XQuery是一种声明性语言, to increment a counter

对于缺少的at特性,一个相当麻烦的解决方法是计算前面的兄弟级<person/>标记:

代码语言:javascript
复制
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。应完全支持此查询:

代码语言:javascript
复制
for $person in /Root/Persons/Person
let $count := count($person/parent::Persons/Person[. << $person]) + 1
return <Person ID="{$count}">{$person}</Person>

顺便说一句,你可能只想粘贴这个人的名字,所以最好用

代码语言:javascript
复制
(: snip :)
return <Person ID="{$count}">{data($person)}</Person>
票数 6
EN

Stack Overflow用户

发布于 2014-09-23 13:56:06

如果您不太熟悉XQuery,另一种可能的公式可能更容易阅读:

代码语言:javascript
复制
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,那么您可以执行以下操作,这是相当不错的:

代码语言:javascript
复制
/Root/Persons/Person ! <Person ID="{position()}">{data(.)}</Person>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18716350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档