【发布时间】:2012-01-25 04:08:08
【问题描述】:
我正在开发自定义 DAL,现在正在处理自动结果分页。 DAL 根据我们的模型生成动态查询,例如:
Model.All() --> generates "select * from mytable"
Model.Filter ("d=@0", "arg0value") --> generates "select * from mytable where d=@0"
...
我不想为我们的过滤函数添加额外的参数,也不想为分页添加专门的函数(当然,如果可以避免的话)。相反,我想对结果进行分页更改查询之前它被执行。比如……
var resultset = Model.Filter ("d=@0, "arg0value"); // "select * from mytable where d=@0"
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 所说,我可以解析查询并根据输出字段添加 ORDER BY,但是:首先,我不想要解析的开销,其次,如果查询的类型为“select * ",我无法提取字段。
【问题讨论】:
-
在 SQL Server 2012 中,将有 OFFSET and FETCH NEXT - 但在那之前,带有
ROW_NUMBER()的 CTE 是您唯一真正可行的选择...
标签: sql sql-server oracle sql-server-2005 data-access-layer