微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SqlServer,ACCESS最快的分页函数

  1. /// <summary>
  2.     /// 对有集聚索引的表(例如表具有唯一值的主健)获取分页sql
  3.     /// </summary>
  4.     /// <param name="tableName">表名称</param>
  5.     /// <param name="selectFields">要选择的列表字段,用逗号分隔</param>
  6.     /// <param name="pkName">主键字段</param>
  7.     /// <param name="condition">条件</param>
  8.     /// <param name="isDESC">是否倒排</param>
  9.     /// <param name="pageSize">页大小</param>
  10.     /// <param name="pageNumber">页码</param>
  11.     /// <param name="allCount">总记录数</param>
  12.     /// <returns></returns>
  13.     public static string GetsqlPageByPK(string tableName,string selectFields,string pkName,string condition,bool isDESC,int pageSize,int pageNumber,int allCount)
  14.     {
  15.         string strsqlTemp = "";
  16.         if (isDESC)
  17.         {
  18.             if (pageNumber <= 1)
  19.                 strsqlTemp = "SELECT TOP @Size @Fields FROM @Table WHERE 1=1 @Condition ORDER BY @PK DESC";
  20.             else
  21.                 strsqlTemp = @"
  22. SELECT TOP @Size @Fields
  23. FROM @Table
  24. WHERE @PK <
  25. (SELECT MIN(@PK) FROM
  26. (SELECT TOP @CurrCount @PK FROM @Table WHERE 1=1 @Condition ORDER BY @PK DESC) as T
  27. )
  28. ORDER BY @PK DESC
  29. ";
  30.         }
  31.         else
  32.         {
  33.             if (pageNumber <= 1)
  34.                 strsqlTemp = "SELECT TOP @Size @Fields FROM @Table WHERE 1=1 @Condition ORDER BY @PK ";
  35.             else
  36.                 strsqlTemp = @"
  37. SELECT TOP @Size @Fields
  38. FROM @Table
  39. WHERE @PK >
  40. (SELECT MAX(@PK) FROM
  41. (SELECT TOP @CurrCount @PK FROM @Table WHERE 1=1 @Condition ORDER BY @PK ) as T
  42. )
  43. ORDER BY @PK 
  44. ";
  45.         }
  46.         //
  47.         int iCurrCount = (pageNumber - 1) * pageSize;
  48.         if (iCurrCount + pageSize > allCount)
  49.             pageSize = allCount - iCurrCount;
  50.         string sql = strsqlTemp.Replace("@Size", pageSize.ToString ())
  51.             .Replace("@Fields", selectFields)
  52.             .Replace("@Table", tableName)
  53.             .Replace("@PK", pkName)
  54.             .Replace("@Condition",condition);
  55.         if(pageNumber>1)
  56.             sql = sql.Replace("@CurrCount", iCurrCount.ToString ());
  57.         return sql;
  58.     }

 * 最快速分页 函数

适用于有唯一值 的集聚索引的快速分页,可以适用于千万级别的分页

算法如下:

--最快的分页算法 ,使用于2-N 页 倒序,当前查询的是第 3 页
--10=(3-1)*2

select top 5 *
from TB
where id <
(select min(id) from
(select top 10 id from TB order by id desc) as T
)
order by id desc

---------------


--------------
--最快的分页算法 ,使用于2-N 页 升序,当前查询的是第 3 页
--10=(3-1)*2

select top 5 *
from TB
where id >
(select max(id) from
(select top 10 id from TB order by id asc) as T
)
order by id asc

注:需要计算最末页的数量

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐