SQL Server两种分页的存储过程使用介绍

所属分类: 数据库 / MsSql 阅读数: 1197
收藏 0 赞 0 分享

由于现在很多的企业招聘的笔试都会让来招聘的写一个分页的存储过程,有的企业甚至要求应聘者用两种方式实现分页,如果没有在实际项目中使用过分页,那么很多的应聘者都会出现一定的问题,下面介绍两种分页的方法。

一、 以学生表为例,在数据库中有一个Student表,字段有StudentNo, ,LoginPwd, StudentName,Sex,ClassId,Phone,Address,BornDate,Email,isDel

要求:查询学生的信息,每页显示5条记录

二、第一种方式分页:利用子查询 not in

例如:

第一页

select top 5 * from Student

第二页: 查询前10条中不在前5条的记录,那么就是6-10,也就是第二页

select top 5 * from Student where StudentNo not in(select top 10 Studentno from Student)

同理可以得到第三页、、、、、、、

这种方式相信大家都能明白,这种分页的存储过程写法就不多做介绍,重点介绍下面那种分页方法。

三、第二种方式分页:利用ROW_NUMBER()这个自带的函数

因为自05之后,提供一个专门用于分页的函数,那就是ROW_NUMBER()这个函数,分页的基本语法:ROW_NUMBER() over(排序字段):可以根据指定的字段排序,对排序之后的结果集的每一行添加一个不间断的行号,相当于连续的id值一样,

例如sql语句:select ROW_NUMBER() over(order by studentno) id, * from Student 那么结果集可以看到:

那么我们可以看到id值是连续的,所有接下来的存储过程写起来就比较简单了。

注意:我们必须为这个结果集命一个新名字,比如我们命名为temp,那么分页存储过程可以写出:

if exists( select * from sysobjects where name='usp_getPageData')
drop proc usp_getPageData --如果存在名字为usp_getPageData的存储过程则删除
go
create proc usp_getPageData --创建名字usp_getPageData存储过程
@toPage int=0 output, --总页数
@pageIndex int =1 , --默认显示第一页
@pageCount int =5 --默认每页的记录为5条
as
select temp.StudentNo,temp.LoginPwd,temp.StudentName,temp.Sex,temp.ClassId,temp.Phone,temp.Address,temp.BornDate,temp.Email,temp.isDel from
(select ROW_NUMBER() over (Order by studentno) id,* from Student) temp
where id>(@pageIndex-1)*@pageCount and id<=@pageIndex*@pageCount

set @toPage=ceiling((select COUNT(*) from Student)*1.0/@pageCount) --使用ceiling函数算出总页数
go

说明因为在实际的项目的开发中,经常要显示总页数给用户看的,所有这里的存储过程增加了一个toPage参数,由于它是要输出给用户看的,所有参数类型定义为output,并用set进行赋值。

以上是对两种分页方法的介绍,如果有任何疑问或不懂的可以留言给我。

更多精彩内容其他人还在看

sqlserver中将varchar类型转换为int型再进行排序的方法

sql中把varchar类型转换为int型然后进行排序,如果我们数据库的ID设置为varchar型的 在查询的时候order by id的话
收藏 0 赞 0 分享

在SQL Server中使用SQL语句查询一个存储过程被其它所有的存储过程引用的存储过程名

在项目开发中如果有时修改了一个存储过程,但是如何能够快速的查找到使用了这个存储过程的其它存储过程呢
收藏 0 赞 0 分享

sqlserver bcp(数据导入导出工具)一般用法与命令详解

bcp是SQL Server中负责导入导出数据的一个命令行工具,它是基于DB-Library的,并且能以并行的方式高效地导入导出大批量的数据
收藏 0 赞 0 分享

重命名SQLServer数据库的方法

本文讲解重命名SQLServer 数据库,包括物理文件名、逻辑文件名的改名
收藏 0 赞 0 分享

SQL Server中通过reverse取某个最后一次出现的符号后面的内容(字符串反转)

昨天在项目中遇到了一个非常简单的问题,需要把SQL Server数据库中保存的一段路径地址取出其文件名,但SQL Server又没有现成的方法,最后在网上找到这样的一个方法,原理是先将字符串反转,取出第一个/的位置,从头进行截取后再次反转
收藏 0 赞 0 分享

使用SqlBulkCopy时应注意Sqlserver表中使用缺省值的列

今天,想将以前做的一个程序增加点功能,原本就使用SqlBulkCopy批量、定时的从目录中的txt文件导入数据到Sqlserver中。以前一直都使用正常,但是不知怎的就老是出现一个错误
收藏 0 赞 0 分享

Sqlserver 2000/2005/2008 的收缩日志方法和清理日志方法

讲解一下sql 2005日志怎么清理。一般情况下,SQL数据库的收缩并不能很大程度上减小数据库大小,其主要作用是收缩日志大小,应当定期进行此操作以免数据库日志过大
收藏 0 赞 0 分享

SQL Server 2000 清理日志精品图文教程

SQL Server 2000 数据库日志太大!如何清理SQL Server 2000的日志呢
收藏 0 赞 0 分享

SQL行号排序和分页(SQL查询中插入行号 自定义分页的另类实现)

如何在SQL中对行进行动态编号,加行号这个问题,在数据库查询中,是经典的问题
收藏 0 赞 0 分享

sql分类汇总及Select的自增长脚本

对错误信息进行分类汇总,并实现错误数据的自增长编号
收藏 0 赞 0 分享
查看更多