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