-1

カーソルを使用して処理するテーブルがあります。その構造が次のようなものであるとしましょう: RID | 学校 | 学校 | 注文 | 文章

ここで、他の学校を除外し (私の学校のみが表示されます)、次に ORDER BY の順序で並べ替えて、テキストを希望どおりに配置します。さて、私の問題は、順序がまっすぐに増加していないことです(それらはすべて学校ごとに一意ですが)、1、2、3、200、823などからスキップできますが、基本的にできる必要があります

SELECT * FROM SCHOOL_DATA WHERE ORDER=@order

order は元の注文値です。カーソルを使用すると (ABSOLUTE を使用しても) テーブルが平坦化されるため、ORDER フィールドが (1 から 2 から 100 に) スキップされると、ORDER=100 が内部テーブルの 3 行目であると見なされます。

しかし、私ができるようにカーソルでそのようなことに対処することは可能ですか

FETCH ABSOLUTE 100..

実際にORDER = 100に対応する行を取得しますか?

4

2 に答える 2

0

カーソルを使わずに、一度に1行ずつ選択する方がよいように思えます。ソラリンの答えに残されたコメントに基づいています。何かのようなもの:

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 に答える
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 に答える