这里面介绍一下常用的分页方法:

1.使用top来分页

  1. select top @pageSize * from table where id not in
  2. (select top @pageSize*(@pageIndex-1) id from table)

2.使用 ROW_NUMBER()OVER

  1. SELECT * FROM (SELECT ROW_NUMBER() OVER (order by T.字段名 desc )AS Row, T.*  from 表名 T  WHERE 条件 ) TT WHERE TT.Row between 起始位置  and 结束位置;
  2. StringBuilder strSql = new StringBuilder();
  3. strSql.Append("SELECT * FROM ( ");
  4. strSql.Append(" SELECT ROW_NUMBER() OVER (");
  5. if (!string.IsNullOrWhiteSpace(orderby.Trim()))
  6. {
  7. strSql.Append("order by T." + orderby);
  8. }
  9. else
  10. {
  11. strSql.Append("order by T.ID desc");
  12. }
  13. strSql.Append(")AS Row, T.*  from TableName T ");
  14. if (!string.IsNullOrWhiteSpace(strWhere.Trim()))
  15. {
  16. strSql.Append(" WHERE " + strWhere);
  17. }
  18. strSql.Append(" ) TT");
  19. strSql.AppendFormat(" WHERE TT.Row between {0} and {1}", startIndex, endIndex);

3.使用分页存储过程

  1. if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sys_Page_v2]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
  2. drop procedure [dbo].[sys_Page_v2]
  3. GO
  4. CREATE PROCEDURE [dbo].[sys_Page_v2]
  5. @PCount int output,    --总页数输出
  6. @RCount int output,    --总记录数输出
  7. @sys_Table nvarchar(100),    --查询表名
  8. @sys_Key varchar(50),        --主键
  9. @sys_Fields nvarchar(500),    --查询字段
  10. @sys_Where nvarchar(3000),    --查询条件
  11. @sys_Order nvarchar(100),    --排序字段
  12. @sys_Begin int,        --开始位置
  13. @sys_PageIndex int,        --当前页数
  14. @sys_PageSize int        --页大小
  15. AS
  16. SET NOCOUNT ON
  17. SET ANSI_WARNINGS ON
  18. IF @sys_PageSize < 0 OR @sys_PageIndex < 0
  19. BEGIN
  20. RETURN
  21. END
  22. DECLARE @new_where1 NVARCHAR(3000)
  23. DECLARE @new_order1 NVARCHAR(100)
  24. DECLARE @new_order2 NVARCHAR(100)
  25. DECLARE @Sql NVARCHAR(4000)
  26. DECLARE @SqlCount NVARCHAR(4000)
  27. DECLARE @Top int
  28. if(@sys_Begin <=0)
  29. set @sys_Begin=0
  30. else
  31. set @sys_Begin=@sys_Begin-1
  32. IF ISNULL(@sys_Where,'') = ''
  33. SET @new_where1 = ' '
  34. ELSE
  35. SET @new_where1 = ' WHERE ' + @sys_Where
  36. IF ISNULL(@sys_Order,'') <> ''
  37. BEGIN
  38. SET @new_order1 = ' ORDER BY ' + Replace(@sys_Order,'desc','')
  39. SET @new_order1 = Replace(@new_order1,'asc','desc')
  40. SET @new_order2 = ' ORDER BY ' + @sys_Order
  41. END
  42. ELSE
  43. BEGIN
  44. SET @new_order1 = ' ORDER BY ID DESC'
  45. SET @new_order2 = ' ORDER BY ID ASC'
  46. END
  47. SET @SqlCount = 'SELECT @RCount=COUNT(1),@PCount=CEILING((COUNT(1)+0.0)/'
  48. + CAST(@sys_PageSize AS NVARCHAR)+') FROM ' + @sys_Table + @new_where1
  49. EXEC SP_EXECUTESQL @SqlCount,N'@RCount INT OUTPUT,@PCount INT OUTPUT',
  50. @RCount OUTPUT,@PCount OUTPUT
  51. IF @sys_PageIndex > CEILING((@RCount+0.0)/@sys_PageSize)    --如果输入的当前页数大于实际总页数,则把实际总页数赋值给当前页数
  52. BEGIN
  53. SET @sys_PageIndex =  CEILING((@RCount+0.0)/@sys_PageSize)
  54. END
  55. set @sql = 'select '+ @sys_fields +' from ' + @sys_Table + ' w1 '
  56. + ' where '+ @sys_Key +' in ('
  57. +'select top '+ ltrim(str(@sys_PageSize)) +' ' + @sys_Key + ' from '
  58. +'('
  59. +'select top ' + ltrim(STR(@sys_PageSize * @sys_PageIndex + @sys_Begin)) + ' ' + @sys_Key + ' FROM '
  60. + @sys_Table + @new_where1 + @new_order2
  61. +') w ' + @new_order1
  62. +') ' + @new_order2
  63. print(@sql)
  64. Exec(@sql)
  65. GO

SQL server 分页方法小结的更多相关文章

  1. SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总

    SQL Server游标   转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...

  2. SQL SERVER 分页方法

    最近项目中需要在SQL SERVER中进行分页,需要编写分页查询语句.之前也写过一些关于分页查询的语句,但是性能不敢恭维.于是在业务时间,在微软社区Bing了一篇老外写的关于SQL SERVER分页的 ...

  3. SQL Server 分页方法汇总

    PageSize = 30 PageNumber = 201 方法一:(最常用的分页代码, top / not in) UserId UserId from UserInfo order by Use ...

  4. SQL server分页的四种方法

    SQL server分页的四种方法 1.三重循环: 2.利用max(主键); 3.利用row_number关键字: 4.offset/fetch next关键字 方法一:三重循环思路  先取前20页, ...

  5. SQL server分页的四种方法(算很全面了)

      这篇博客讲的是SQL server的分页方法,用的SQL server 2012版本.下面都用pageIndex表示页数,pageSize表示一页包含的记录.并且下面涉及到具体例子的,设定查询第2 ...

  6. 解决hibernate对Sql Server分页慢的问题

    一.hibernate分页 hibernate对MsSql的伪分页 分页是web项目中比不可少的一个功能,数据量大的时候不能全部展示必然要用到分页技术.相信大家对hibernate中的分页都不陌生: ...

  7. SQL Server BCP使用小结

    原文:SQL Server BCP使用小结 用法: bcp {dbtable )   );GO--输出XML格式化文件--说明一下:-t","是指定字段分隔符,稍后我们会讲到exe ...

  8. 干货 | SSMS客户端连接京东云RDS SQL Server配置方法

    干货 | SSMS客户端连接京东云RDS SQL Server配置方法 原创: 于振江 京东云开发者社区  微软SQL Server, Oracle数据库以及MySQL系列占据了关系型数据库市场的绝对 ...

  9. SQL Server分页模板

    SQL Server分页模板 WITH T AS ( SELECT ROW_NUMBER() OVER(ORDER BY AlbumId ) AS row_number, * FROM (SELECT ...

随机推荐

  1. Android:UI 沉浸式体验,适合第一屏的引导图片、预览图片。

    链接:http://www.cnblogs.com/liushilin/p/5799381.html

  2. Atitit tomcat在linux服务器的启动与其他

    Atitit tomcat在linux服务器的启动与其他 1.1. /home/tomcat/tomcat3/bin/startup.sh1 1.2. 判断启动是否成功 ps -ef|grep tom ...

  3. FFmpeg(9)-解码器解码代码演示(FFmpeg调用MediaCodec实现硬解码、多线程解码、及音视频解码性能测试)

    一.AVFrame 用来存放解码后的数据. [相关函数] AVFrame *frame = av_frame_alloc();                       // 空间分配,分配一个空间 ...

  4. chrome浏览器:chrome 69 恢复默认UI

    1.在浏览器地址栏输入 chrome://flags/#top-chrome-md 并回车 2.将UI Layout for the browser's top chrome 右边的选项修改为Norm ...

  5. 每日英语:China Bond Trading Dives

    SHANGHAI—Trading volume in China's bond market has plummeted in recent months, in another reminder o ...

  6. ubuntu14 安装 端口转发工具rinetd

    1,下载  第一中方式 用 apt-get install rinetd  或者从官网下载http://www.boutell.com/rinetd/ 2,配置,端口转发的配置在 /etc/rinet ...

  7. WebService 获取当前URL

    private string pageRoot = string.Empty; public virtual string PortalRoot { get { if (pageRoot == nul ...

  8. 设计模式之策略模式(iOS开发,代码用Objective-C展示)

    在实际开发过程中,app需求都是由产品那边给出,往往是他给出第一版功能,我们写好代码后,会相应的给出第二版.第三版功能,而这些功能是在实际使用中,根据用户需求而不断增加的.如果在编码之初,我们并未认识 ...

  9. Node.js学习笔记(3)--url.parse方法

    说明(2017-5-2 14:23:47): 1. index.html <!DOCTYPE html> <html lang="en"> <head ...

  10. Android 面试知识集1

    今晚在复习Android基础的时候,找到了一些很有价值的基础知识,分享给给位Android的开发者.这些是基础知识,同时也可以当做面试准备.面试题其实是很好的基础知识学习,有空会好好整理相关基础知识. ...