我正在處理自定義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 *」,我無法提取這些字段。
在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