2

結果がページ付けされるように、既存のストアド プロシージャをリファクタリングするタスクが与えられました。SQL サーバーは SQL 2000 なので、ページネーションの ROW_NUMBER メソッドを使用できません。ストアド プロシージャはすでにかなり複雑で、sp_executesql を実行する前に大きな sql ステートメントのチャンクをまとめて作成し、さまざまな並べ替えオプションを利用できます。

Google からの最初の結果は良い方法のように思えますが、2 番目の並べ替えを逆にする必要があり、開始がページの長さよりも短い場合は失敗するという点で、この例は間違っていると思います。そのページの 2 番目の例も良い方法のようですが、SP は開始レコードではなく pageNumber を使用しています。そして、一時テーブル全体がパフォーマンスの低下になるようです。

私はこの道を進んでいますが、遅くて紛らわしいようです。正しい結果を得るには、並べ替え順序でかなりの数の REPLACE メソッドを実行する必要があります。

私が見逃している他の簡単なテクニックはありますか?

4

6 に答える 6

1

この StackOverflow の質問には、SQL Server 2000 に準拠した回答が 2 つあります。2005のみの受け入れられた回答はスキップしてください。

于 2009-01-19T21:41:50.100 に答える
0

しばらくこれで遊んだ後、これを実際に行う方法は1つしかないようです(開始パラメーターと長さパラメーターを使用)。それは一時テーブルを使用する方法です。

私の最終的な解決策は、@ startパラメーターを使用せ、代わりに@pageパラメーターを使用してから、

    SET @sql = @sql + N'

    SELECT * FROM
    (
    SELECT TOP ' + Cast( @length as varchar) + N' * FROM 
            (
            SELECT TOP ' + Cast( @page*@length as varchar) + N'
                 field1,
                 field2 
                 From Table1
                 order by field1 ASC
            )  as Result   
            Order by Field1 DESC
     )  as Result
     Order by Field 1 ASC'

元のクエリはここに示されているものよりもはるかに複雑で、順序は少なくとも3つのフィールドで順序付けられ、長いCASE句によって決定されたため、一連のREPLACE関数を使用してフィールドを正しい順序で取得する必要がありました。

于 2009-01-15T20:08:57.850 に答える
0

このクエリのバリエーションを何年も使用してきました。この例では、アイテムが 50,000 から 50,300 になります。

select top 300 
  Items.*
from Items
where 
  Items.CustomerId = 1234 AND
  Items.Active = 1 AND
  Items.Id not in
  ( 
    select top 50000 Items.Id
    from Items
    where 
      Items.CustomerId = 1234 AND
      Items.Active = 1
    order by Items.id
  )
order by Items.Id
于 2009-01-19T15:47:10.753 に答える
0

アプリケーションのアーキテクチャ (およびデータの量、構造、DB サーバーの負荷など) によっては、DB アクセス レイヤーをページングに使用できます。

たとえば、ADO を使用すると、レコード セット (ADO.NET では DataSet) オブジェクトでページ サイズを定義し、クライアントでページングを実行できます。従来の ADO では、サーバー側のカーソルを使用することもできますが、それが適切にスケーリングされるかどうかはわかりません (これは ADO.NET で完全に削除されたと思います)。

MSDN ドキュメント:クエリ結果のページング (ADO.NET)

于 2009-01-15T18:31:55.050 に答える
0

いいえ、そうではありません.SQL Server 2000には、Common Table Expression(CTE)などの2005の優れた機能はありません.Googleリンクで説明されている方法は、1つの方法のようです.

マルク

于 2009-01-15T17:16:44.390 に答える
0

こちらもご覧ください http://databases.aspfaq.com/database/how-do-i-page-through-a-recordset.html

ストアド プロシージャ メソッドまで下にスクロールします。

于 2009-01-15T17:19:08.083 に答える