为SQL Server的动态复杂查询进行分页

时间:2012-09-13 13:21:48

标签: sql-server

我找不到一种简单的方法来为SQL服务器进行复杂查询的分页。我需要编写将sql查询作为参数的函数(此查询可以包括子查询,按语句排序,分组等)并检索特定的结果页面。在oracle中,通过使用另一个select语句封装这样的查询很容易,但对于SQL服务器,我找不到任何simillar方式。我想避免的是解析输入SQL语句。我正在使用SQL Server 2005

1 个答案:

答案 0 :(得分:2)

在SQL Server 2005及更高版本中进行分页最好通过排名功能完​​成。但是,鉴于任意SQL查询未排序,您需要以某种方式指定要使其工作的排序,这与您尝试制作(*)的通用解决方案并不真正“兼容”。 / p>

建议的方法是这样的(假设变量@PageSize包含每页的项目数,并且@Page为您要检索的页面的基于1的索引:< / p>

WITH NumberedQuery AS (
  SELECT ROW_NUMBER() OVER (ORDER BY q.SomeColumn) ix, q.*
  FROM QueryToPage q
)
SELECT nq.*
  FROM NumberedQuery nq
  WHERE (nq.ix >= (@Page-1)*@PageSize) AND (nq.ix < @Page*@PageSize);

(*):使用连接SQL代码的方法有几个问题,它会阻止使用参数化查询,它会增加SQL注入的风险,会损害性能,如果订单未指定,则无法解决手头的问题。