-1

我有一个使用游标处理的表。可以说它的结构是这样的:RID | 学校 | 订购 | 文本

现在,我过滤掉其他学校(所以只显示我的),然后我按顺序排序,这样我就可以按照我想要的方式排列文本。现在,我的问题是,订单不是直接递增的(尽管每个学校都是唯一的)它可以跳过 1,2,3,200,823 等,但我需要能够基本上做一个

SELECT * FROM SCHOOL_DATA WHERE ORDER=@order

订单是原始订单价值。使用游标(即使使用 ABSOLUTE)它会展平表,以便当 ORDER 字段跳出位置(从 1 到 2 到 100)时,它认为 ORDER=100 是它内部表中的第三行,因为它应该。

但是有没有可能用游标来解决这样的事情,这样我就可以做到

FETCH ABSOLUTE 100..

并实际得到与 ORDER=100 对应的行?

4

2 回答 2

0

为了能够做到这一点,您必须创建一个为所有缺失Order值生成空行的查询。似乎是一件愚蠢的事情。

我的印象是游标对于您想要实现的任何目标都不是正确的,也许您可​​以更多地解释一下意图,以便人们可以提供可行的替代方案?

例如,将结果放入表变量中,并在该表中查询正确的 Order 值似乎是一种替代方法。

DECLARE @school int = 1

DECLARE @schoolData TABLE
(
    RID int,
    School int,
    [Order] int,
    Text ntext
);

INSERT INTO @schoolData 
    SELECT * 
    FROM SCHOOL_DATA
    WHERE School=@school ORDER BY [Order]

SELECT * FROM @schoolData WHERE [Order]=100

然而。我得到的明显印象是您既不应该使用游标,也不应该使用任何临时存储。

于 2009-07-24T22:44:08.250 回答
0

在我看来,您最好不要使用光标,而只需一次选择一行。基于对 Thorarin 的回答留下的评论。就像是:

declare ... all the variables to hold the different columns.
declare @CurrentOrder ... proper datatype

set @CurrentOrder = ... initial value
while(1=1)
begin
  Select @Var1 = Column1, @Var2 = Column2, etc, @GotoWhere = GotoWhere
  from SCHOOL_DATA
  where Order = @CurrentOrder
  select @RC = @@Rowcount, @E = @@ERROR
  ... do error handling if @RC <> 1 or @E <> 0. Can wrap with try catch if using 2005+
  ... do work.
  ... error out if @GotoWhere is null
  if (... done condition ...)
     exit
  set @CurrentOrder = @GotoWhere
end
于 2009-07-25T20:24:41.723 回答