I am using SQL Server 2008 R2. My problem is that I want to count number of hits that i receive from XQuery query using FLWOR. For each hit, I want a consecutive number, like: 0,1,2,3,4...
My query:
select @xml.query('for $s at $count in /Root/Persons/Person
return <Person ID="{$count}">{$s}</Person>')
The only problem here is this is not supported in SQL Server and I receive an error:
Msg 9335, Level 16, State 1, Line 16
XQuery [query()]: The XQuery syntax 'at' is not supported.
I've also tried with let keyword and define new variable but I don't know how to increase value of that variable with each iteration?
Thanks for all the answers, Frenky
XQuery is a declarative language, you cannot use
let
to increment a counter.A rather hackish workaround to the missing
at
feature would be to count the preceding sibling<person/>
tags:Be aware that this code will have
O(n^2)
runtime if not optimized by the execution engine (which it will probably not do) because of the repeated preceding sibling scans.Edit: As stated in the comments, MS SQL doesn't even support the
preceding-sibling
axis. They do support the<<
node order comparison operator, though. This query should be fully supported:By the way, you possibly only want to paste the person's name, so better use
Another possible formulation that may arguably be easier to read if you are not so familiar with XQuery:
Also if SQL Server does/ever support(s) XQuery 3.0, then you could do the following which is rather nice: