2011-12-21 6 views
3

私はカスタムDALで作業しており、自動結果ページネーションを扱っています。 (それはもちろん、回避可能だ場合、ウェル)私はページ付けのために私たちのフィルタ機能、また特殊な機能に追加のパラメータを追加したくないROW_NUM()OVER(ORDER BY xxxxx)を使用せずにSQL Serverでクエリにページを設定できますか?

Model.All() --> generates "select * from mytable" 
Model.Filter ("[email protected]", "arg0value") --> generates "select * from mytable where [email protected]" 
... 

:DALは次のように、私たちのモデルに基づいた動的なクエリを生成します。代わりに、私はの前にのクエリを変更した結果にページを分けて実行したいと思います。何かのように...

var resultset = Model.Filter ("[email protected], "arg0value"); // "select * from mytable where [email protected]" 
resulset = resultset.Paginate (1, 25); // this should paginate the query before loading any objects 

Oracleでは、ROWNUM疑似列を使用して古いクエリをラップするのは簡単です。

select * from (my old sql) where rownum between 20 and 40 

Sql Server(2005)では、ROWNUMのようなものはありません。私はROW_NUMBER関数があるのを見ましたが、 "OVER(ORDER BY xxxx)"節を渡す必要があるので、クエリの内部を知る必要があります。

select row_number() over (order By <?????>) as rownum, dv.* from (my old sql) as dv where rownum between 20 and 40 

私たちのモデルに特定のパラメータ/機能を追加せずにSql Serverでこれを実行する方法はありますか?

ありがとうございます!

編集

@Demsは、私は、クエリを解析し、出力フィールドに基づいていますが、BY ORDERを追加することができ、言うように:まず、私は構文解析のオーバーヘッドをしたい、と第二ませんが、もしクエリが "select *"型の場合、フィールドを抽出できません。独自のデータアクセス層を書いている、とあなたが(むしろそれの内部よりも)のみ、クエリの出力フィールド名を知っている()ROW_NUMBERを適用したい場合は

+1

、 [OFFSET AND FETCH NEXT]が表示されます(http://www.kodyaz.com/sql-server-2012/sql-paging-in-sql-server-2012-sql-order-by-offset-fetch-next- rows.aspx) - それまでは、 'ROW_NUMBER()'のCTEがあなたの唯一の実用的な選択肢です... –

答えて

3

...

のSQL Server 2012では
SELECT 
    * 
FROM 
(
    SELECT 
    ROW_NUMBER() OVER (ORDER BY field1, field2, field3) AS row_id, 
    * 
    FROM 
    (
    <your-query> 
) 
    AS unordered_data 
) 
    AS ordered_data 
WHERE 
    row_id BETWEEN x AND y 
+0

あなたの答えはありがたいですが、prevクエリが "select * ..."の場合は抽出できませんフィールド。私はこれを反映するために質問を更新しました。 –

+0

次に、クライアントでプルされたレコードを、おそらくレコードセットを使用して制御するオプションしかありません。これは、不要なレコードを引き出すネットワークトラフィックを回避するために使用できますが、SQL Serverに負荷をかけません。 – MatBailie

+0

いくつかの特定の関数を追加する必要があるようです。そのため、クエリ生成時にモデルメタデータを使用できます。私は時間を待つだろう。より良い答えがない場合は、洞察のためにこれを受け入れます。ありがとう。 –

関連する問題