1

我需要从我的关系数据库中提取数据作为 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>
…
4

2 回答 2

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 中的 let 不会在每次迭代时保留值。for 的 at 子句将满足您的需求。

于 2012-07-08T01:06:28.527 回答
0
let $i := 0
     for $Territories in collection("Northwind.dbo.Territories")/Territories
     let $i := $i + 1
     return

在内部创建let了一个名为的变量i

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

于 2012-07-07T16:06:41.903 回答