有没有办法对提取的记录进行编号。

时间:2012-07-07 08:44:31

标签: xquery

我需要从关系数据库中提取数据作为XML,我需要为每个提取的记录分配一个数字。我写了下面的XQuery ......

<myRecords> {
    let $i := 0
    for $Territories in collection("Northwind.dbo.Territories")/Territories
    let $i := $i + 1
    return
        <territory rec_count="{$i}">
            {$Territories/TerritoryDescription/text()}
        </territory>
} </myRecords>

......我没有得到我预期的结果:

<myRecords>
    <territory rec_count="1">Westboro</territory>
    <territory rec_count="1">Bedford</territory>
    <territory rec_count="1">Georgetown</territory>
…

记录编号不会增加。为什么呢?

XQuery是一种没有副作用的函数式语言 - 例如,您可能无法像在Java或C#中那样在XQuery中创建状态概念。在某些情况下,您可以使用递归函数模拟状态,但要解决此问题,有一个更简单的解决方案:您可以使用位置变量。这是XQuery:

<myRecords> {
    for $Territories at $i in collection("Northwind.dbo.Territories")/Territories
    return
        <territory rec_count="{$i}">
            {$Territories/TerritoryDescription/text()}
        </territory>
} </myRecords>

这是(希望的)结果:

<myRecords>
    <territory rec_count="1">Westboro</territory>
    <territory rec_count="2">Bedford</territory>
    <territory rec_count="3">Georgetow</territory>
…

2 个答案:

答案 0 :(得分:1)

为Dimitre的答案添加一些内容,以下是如何做你正在尝试做的事情:

<myRecords> {
  for $Territories at $i in collection("Northwind.dbo.Territories")/Territories
  return
    <territory rec_count="{$i}">
      {$Territories/TerritoryDescription/text()}
    </territory>
} </myRecords>

正如Dimitre所指出的那样,for for内部的let不会保留每次迭代的值。 for的at子句将满足您的需要。

答案 1 :(得分:0)

let $i := 0
     for $Territories in collection("Northwind.dbo.Territories")/Territories
     let $i := $i + 1
     return

在内部let中创建名为i变量。

它被定义为具有外部 $i的值加一:0 + 1,其为1