0

SQL サーバーの複雑なクエリに対してページングを行う簡単な方法が見つかりません。SQL クエリを引数として受け取る関数を作成し (このクエリには、サブクエリ、order by ステートメント、グループ化などを含めることができます)、結果の特定のページを取得する必要があります。オラクルでは、そのようなクエリを別のselectステートメントでカプセル化することで簡単にできますが、SQLサーバーでは同様の方法が見つかりません. 避けたいのは、入力 SQL ステートメントを解析することです。SQL Server 2005 を使用しています

4

1 に答える 1

2

SQL Server 2005以降でのページングは​​、ランク付け関数を使用して行うのが最適です。ただし、任意のSQLクエリが並べ替えられていない場合、これが機能するために並べ替えを指定する必要があります。これは、作成しようとしている一般的なソリューションとは実際には「互換性がありません」(*)。

@PageSizeこれを行うための推奨される方法は次のとおりです(ページあたりのアイテム数を含む変数を想定し、@Page取得するページへの1ベースのインデックスとして):

WITH NumberedQuery AS (
  SELECT ROW_NUMBER() OVER (ORDER BY q.SomeColumn) ix, q.*
  FROM QueryToPage q
)
SELECT nq.*
  FROM NumberedQuery nq
  WHERE (nq.ix >= (@Page-1)*@PageSize) AND (nq.ix < @Page*@PageSize);

(*):SQLコードを連結するアプローチにはいくつかの問題があり、パラメーター化されたクエリの使用を妨げ、SQLインジェクションのリスクを追加し、パフォーマンスを低下させ、順序が指定されていない場合、目前の問題を解決できません。

于 2012-09-13T13:30:21.827 に答える