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 ...
随机推荐
- PhotoShop CS6实现照片背景虚化效果
在摄影实践中,虚化背景是突出主体的常用手段.但是由于消费级DC镜头的实际焦距都很短,因此实现浅景深而虚化背景的难度较大.如果我们希望用消费级DC也能达到虚化背景突出主体的效果,那么,Photoshop ...
- pandas数组和numpy数组在使用索引数组过滤数组时的区别
numpy array 过滤后的数组,索引值从 0 开始. pandas Series 过滤后的 Series ,保持原来的索引,原来索引是几,就是几. 什么意思呢,来看个栗子: import num ...
- (原创)一个和c#中Lazy<T>类似的c++ Lazy<T>类的实现
在.net 4.0中增加一个延迟加载类Lazy<T>,它的作用是实现按需延迟加载,也许很多人用过.一个典型的应用场景是这样的:当初始化某个对象时,该对象引用了一个大对象,需要创建,这个对象 ...
- BleedTree动画混合树[Unity]
Unity在中土大陆的大肆推广能从广泛的中文翻译资料中看出.所以,手册才是王道. 游戏动画中的一个常见任务是在两个或更多相似运动之间混合.最佳的已知示例可能是根据角色速度混合行走和奔跑动画.另一个示例 ...
- HBase写入性能及改造——multi-thread flush and compaction(续:详细测试数据)[转]
转载:http://blog.csdn.net/kalaamong/article/details/7290192 接上文啊: 测试机性能 CPU 16* Intel(R) Xeon(R) CPU ...
- 【delphi】关键字详解
absolute {它使得你能够创建一个新变量, 并且该变量的起始地址与另一个变量相同.} var Str: ]; StrLen: Byte absolute Str; {这个声明指定了变量StrLe ...
- 【转】【MySQL报错】ERROR 1558 (HY000): Column count of mysql.user is wrong. Expected 43, found 39.
之前在centos6.4系统安装的是自带的mysql 5.1版本,后来升级到了5.6版本,执行以下命令报错 在网上查找原因说说因为升级不当导致,执行以下命令即可正常执行命令 mysql_upgrade ...
- idea 开启 problems自动代码检查
勾上此处 会自动出现 疑问 可能需要装 problems view插件
- Android padding 和margin
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout ...
- Dell 服务器阵列扩容【经验分享(转)】
看到论坛有朋友发帖询问Dell服务器的扩容,索性整理下之前做的文档,发出来和大家做个分享. 做之前给大家提醒2个注意点:①请做好数据备份,相同于HP.IBM,该扩容过程是不可逆的.②本扩容方法支持同级 ...