我可以在不使用ROW_NUM()OVER(ORDER BY xxxxx)的情况下在Sql Server中对查询进行分页吗?

时间:2011-12-21 10:19:18

标签: sql sql-server oracle sql-server-2005 data-access-layer

我正在开发自定义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 *” “,我无法提取田地。

1 个答案:

答案 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