SQL server 分页方法小结
这里面介绍一下常用的分页方法:
1.使用top来分页
- select top @pageSize * from table where id not in
- (select top @pageSize*(@pageIndex-1) id from table)
2.使用 ROW_NUMBER()OVER
- SELECT * FROM (SELECT ROW_NUMBER() OVER (order by T.字段名 desc )AS Row, T.* from 表名 T WHERE 条件 ) TT WHERE TT.Row between 起始位置 and 结束位置;
- StringBuilder strSql = new StringBuilder();
- strSql.Append("SELECT * FROM ( ");
- strSql.Append(" SELECT ROW_NUMBER() OVER (");
- if (!string.IsNullOrWhiteSpace(orderby.Trim()))
- {
- strSql.Append("order by T." + orderby);
- }
- else
- {
- strSql.Append("order by T.ID desc");
- }
- strSql.Append(")AS Row, T.* from TableName T ");
- if (!string.IsNullOrWhiteSpace(strWhere.Trim()))
- {
- strSql.Append(" WHERE " + strWhere);
- }
- strSql.Append(" ) TT");
- strSql.AppendFormat(" WHERE TT.Row between {0} and {1}", startIndex, endIndex);
3.使用分页存储过程
- if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sys_Page_v2]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
- drop procedure [dbo].[sys_Page_v2]
- GO
- CREATE PROCEDURE [dbo].[sys_Page_v2]
- @PCount int output, --总页数输出
- @RCount int output, --总记录数输出
- @sys_Table nvarchar(100), --查询表名
- @sys_Key varchar(50), --主键
- @sys_Fields nvarchar(500), --查询字段
- @sys_Where nvarchar(3000), --查询条件
- @sys_Order nvarchar(100), --排序字段
- @sys_Begin int, --开始位置
- @sys_PageIndex int, --当前页数
- @sys_PageSize int --页大小
- AS
- SET NOCOUNT ON
- SET ANSI_WARNINGS ON
- IF @sys_PageSize < 0 OR @sys_PageIndex < 0
- BEGIN
- RETURN
- END
- DECLARE @new_where1 NVARCHAR(3000)
- DECLARE @new_order1 NVARCHAR(100)
- DECLARE @new_order2 NVARCHAR(100)
- DECLARE @Sql NVARCHAR(4000)
- DECLARE @SqlCount NVARCHAR(4000)
- DECLARE @Top int
- if(@sys_Begin <=0)
- set @sys_Begin=0
- else
- set @sys_Begin=@sys_Begin-1
- IF ISNULL(@sys_Where,'') = ''
- SET @new_where1 = ' '
- ELSE
- SET @new_where1 = ' WHERE ' + @sys_Where
- IF ISNULL(@sys_Order,'') <> ''
- BEGIN
- SET @new_order1 = ' ORDER BY ' + Replace(@sys_Order,'desc','')
- SET @new_order1 = Replace(@new_order1,'asc','desc')
- SET @new_order2 = ' ORDER BY ' + @sys_Order
- END
- ELSE
- BEGIN
- SET @new_order1 = ' ORDER BY ID DESC'
- SET @new_order2 = ' ORDER BY ID ASC'
- END
- SET @SqlCount = 'SELECT @RCount=COUNT(1),@PCount=CEILING((COUNT(1)+0.0)/'
- + CAST(@sys_PageSize AS NVARCHAR)+') FROM ' + @sys_Table + @new_where1
- EXEC SP_EXECUTESQL @SqlCount,N'@RCount INT OUTPUT,@PCount INT OUTPUT',
- @RCount OUTPUT,@PCount OUTPUT
- IF @sys_PageIndex > CEILING((@RCount+0.0)/@sys_PageSize) --如果输入的当前页数大于实际总页数,则把实际总页数赋值给当前页数
- BEGIN
- SET @sys_PageIndex = CEILING((@RCount+0.0)/@sys_PageSize)
- END
- set @sql = 'select '+ @sys_fields +' from ' + @sys_Table + ' w1 '
- + ' where '+ @sys_Key +' in ('
- +'select top '+ ltrim(str(@sys_PageSize)) +' ' + @sys_Key + ' from '
- +'('
- +'select top ' + ltrim(STR(@sys_PageSize * @sys_PageIndex + @sys_Begin)) + ' ' + @sys_Key + ' FROM '
- + @sys_Table + @new_where1 + @new_order2
- +') w ' + @new_order1
- +') ' + @new_order2
- print(@sql)
- Exec(@sql)
- GO
SQL server 分页方法小结的更多相关文章
- SQL Server游标 C# DataTable.Select() 筛选数据 什么是SQL游标? SQL Server数据类型转换方法 LinQ是什么? SQL Server 分页方法汇总
SQL Server游标 转载自:http://www.cnblogs.com/knowledgesea/p/3699851.html. 什么是游标 结果集,结果集就是select查询之后返回的所 ...
- SQL SERVER 分页方法
最近项目中需要在SQL SERVER中进行分页,需要编写分页查询语句.之前也写过一些关于分页查询的语句,但是性能不敢恭维.于是在业务时间,在微软社区Bing了一篇老外写的关于SQL SERVER分页的 ...
- SQL Server 分页方法汇总
PageSize = 30 PageNumber = 201 方法一:(最常用的分页代码, top / not in) UserId UserId from UserInfo order by Use ...
- SQL server分页的四种方法
SQL server分页的四种方法 1.三重循环: 2.利用max(主键); 3.利用row_number关键字: 4.offset/fetch next关键字 方法一:三重循环思路 先取前20页, ...
- SQL server分页的四种方法(算很全面了)
这篇博客讲的是SQL server的分页方法,用的SQL server 2012版本.下面都用pageIndex表示页数,pageSize表示一页包含的记录.并且下面涉及到具体例子的,设定查询第2 ...
- 解决hibernate对Sql Server分页慢的问题
一.hibernate分页 hibernate对MsSql的伪分页 分页是web项目中比不可少的一个功能,数据量大的时候不能全部展示必然要用到分页技术.相信大家对hibernate中的分页都不陌生: ...
- SQL Server BCP使用小结
原文:SQL Server BCP使用小结 用法: bcp {dbtable ) );GO--输出XML格式化文件--说明一下:-t","是指定字段分隔符,稍后我们会讲到exe ...
- 干货 | SSMS客户端连接京东云RDS SQL Server配置方法
干货 | SSMS客户端连接京东云RDS SQL Server配置方法 原创: 于振江 京东云开发者社区 微软SQL Server, Oracle数据库以及MySQL系列占据了关系型数据库市场的绝对 ...
- SQL Server分页模板
SQL Server分页模板 WITH T AS ( SELECT ROW_NUMBER() OVER(ORDER BY AlbumId ) AS row_number, * FROM (SELECT ...
随机推荐
- 使用 Apache Commons CLI 开发命令行工具示例
Apache Commons CLI 简介 Apache Commons CLI 是 Apache 下面的一个解析命令行输入的工具包,该工具包还提供了自动生成输出帮助文档的功能. Apache Com ...
- 使用MySQL Proxy和MySQL Replication实现读写分离
MySQL Replication可以将master的数据复制分布到多个slave上,然后可以利用slave来分担master的读压力.那么对于前台应用来说,就要考虑如何将读的压力分布到多个slave ...
- 通过纯代码方式发布WCF服务
网络上搜索WCF服务,一般是寄宿在IIS,通过WebConfig方式配服务地址,接口类型等信息,但是对于我这样的懒人,目前项目在开发阶段,实在不愿意每次添加新服务就更新配置文件,于是使用了反射来加载服 ...
- Chrome浏览器查看 iframe信息 OpenFrame
https://chrome.google.com/webstore/search/openframe?hl=zh-CN&_category=extensions 搜索 OpenFrame 添 ...
- 淘宝分布式数据层TDDL
剖析淘宝 TDDL ( TAOBAO DISTRIBUTE DATA LAYER ) 注:原文:http://gao-xianglong.iteye.com/blog/1973591 前言 在开始 ...
- STL deque用法
Deque 容器 deque容器是C++标准模版库(STL,Standard Template Library)中的部分内容.deque容器类与vector类似,支持随机访问和快速插入删除,它在容器中 ...
- Linux服务开机自启动使用示例
本文以redis服务为例,介绍了两种服务自启动的方法service,systemctl使用示例 1.修改redis.conf,允许后台运行 daemonize no 改为 daemonize yes ...
- Java 编程下正则表达式判断字符串是否包含中文
package cn.sunzn.demo; import java.util.regex.Matcher; import java.util.regex.Pattern; public class ...
- 【Linux】Linux根目录下各文件夹的意义
[root@localhost /]# ll / total 102 dr-xr-xr-x. 2 root root 4096 Dec 1 07:37 bin # binary file,二进制执行文 ...
- 【Qt】qt库结构及示例
QT库结构 Qt图形库是一个组织严谨的C++类库,其结构如图所示 细说Qt库 Qt类库中包含了上百个类,结构十分复杂,上图展示了Qt_3.2类库的基本结构. Qt类库中的类可以分成两种类型: 一种是直 ...