我找不到一种简单的方法来为 SQL 服务器的复杂查询进行分页。我需要编写将 sql 查询作为参数的函数(此查询可以包括子查询、按语句排序、分组等)并检索特定页面的结果。在 oracle 中,通过用另一个 select 语句封装这样的查询很容易,但是对于 SQL 服务器,我找不到任何类似的方法。我想避免的是解析输入 SQL 语句。我正在使用 SQL Server 2005
问问题
549 次
1 回答
2
SQL Server 2005 及更高版本中的分页最好通过排名函数来完成。但是,鉴于任意 SQL 查询是未排序的,您需要以某种方式指定排序方式才能使其工作,这与您尝试制作的通用解决方案并不真正“兼容”(*)。
建议的方法是这样的(假设变量@PageSize
具有每页的项目数,并且@Page
作为要检索的页面的基于 1 的索引):
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 注入的风险,它损害了性能,如果未指定顺序,它无法解决手头的问题。
于 2012-09-13T13:30:21.827 回答