我正在开发自定义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 *” “,我无法提取田地。
答案 0 :(得分: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