2011-12-21 25 views
3

我正在處理自定義DAL,現在正在處理自動結果分頁。該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]" 
... 

我不想額外參數添加到我們的過濾功能,也沒有專門的職能分頁(當然,如果是可以避免的,當然)。相反,我想分頁更改之前的結果它被執行。喜歡的東西...

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服務器,而無需添加特定參數/功能,我們的模型來執行這個辦法?

謝謝!

編輯

由於@Dems說,我可以解析查詢,並添加ORDER BY基於輸出字段,但是:第一,我不想要解析的開銷,和第二,如果查詢的類型是「select *」,我無法提取這些字段。

+1

在SQL Server 2012中,會有[OFFSET和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是你唯一真正可行的選擇... – 2011-12-21 10:30:04

回答

3

如果你正在寫自己的數據訪問層,並要應用ROW_NUMBER()只知道查詢的輸出字段名(而不是它的內部)...

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 * ...」,我無法提取田野。我已經更新了這個問題來反映這一點。 – 2011-12-21 10:55:42

+0

然後,您唯一可用的選項是控制客戶端中的記錄,可能使用記錄集。這可以用來避免網絡流量超出不必要的記錄,但不會保存SQL Server上的任何負載。 – MatBailie 2011-12-21 10:58:34

+0

看來我不得不添加一些特定的功能,所以我可以在查詢生成過程中使用模型元數據。我會等一會兒。如果沒有更好的答案,我會接受這一點,以提高洞察力。謝謝。 – 2011-12-21 11:19:51

相關問題