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

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. 分布式系统的那些事儿(六) - SOA架构体系

    有十来天没发文了,实在抱歉!最近忙着录视频,同时也做了个开源的后台管理系统LeeCX,目前比较简单,但是后续会把各类技术完善.具体可以点击“原文链接”. 那么今天继续说分布式系统的那些事. 我们现在动 ...

  2. <![CDATA[]]>和转义字符

    被<![CDATA[]]>这个标记所包含的内容将表示为纯文本,比如<![CDATA[<]]>表示文本内容“<”. 此标记用于xml文档中,我们先来看看使用转义符的情 ...

  3. ASP.NET Core2.0 环境下MVC模式的支付宝PC网站支付接口-沙箱环境开发测试

    1.新建.NET Core web项目 2.Controllers-Models-Views 分三个大部分 3.下载安装最新sdk 官方的SDK以及Demo都还是.NET Framework的,根据官 ...

  4. [Windows Azure] Enabling Diagnostics in Windows Azure

    Enabling Diagnostics in Windows Azure Windows Azure Diagnostics enables you to collect diagnostic da ...

  5. Win7中的路由转发配置实验

    目的 Win7  两张网卡,两个网段的pc互通. 环境搭建 PC1通过交叉网线连接(如果是08年后的电脑,直通线交叉线都可以). PC2为笔记本电脑,一端用网口与pc连接,一端通过wifi与路由连接. ...

  6. Result映射成对象和List

    package com.com.dbhelper; import java.lang.reflect.Field; import java.lang.reflect.Method; import ja ...

  7. Ubuntu首次安装后root权限解锁

    在ubuntu系统下,为了安全起见,在安装过程中,系统屏蔽了用户设置root用户.导致很多用户在使用过程中不知道root密码到底是什么. 可以使用如下方法解决: 先解除root锁定,为root用户设置 ...

  8. golang初始化结构体数组

    最近组里新项目要求用go来写,没办法只能边看文档边写代码,今天遇到郁闷的问题,查了好久最终发现居然是一个标点符号的导致的,遂纪录之 刚刚给一个接口写单元测试时想初始化一个结构体数组,然后遍历该数组并建 ...

  9. Python提取MD5

    使用Python的hashlib模块提取MD5,网上参考,觉得这个还不错,可以作为模块直接使用. # -*- coding: utf-8 -*- import hashlib import sys i ...

  10. WPF学习笔记(3)——style

    http://www.cnblogs.com/Zhouyongh/archive/2011/08/01/2123610.html Style 用来在类型的不同实例之间共享属性.资源和事件处理程序,您可 ...