SQL分页存储过程

CREATE PROC [dbo].[PAGETEST]
@pagesize int,         --每页显示记录数
@currentpage int,      --当前页
@datastatus int,
@IsValid int,
@rowcount int output, --总记录数
@pagecount int output --总页数
AS
select
@rowcount=COUNT(*)
from dbo.Task
where DataStatus=@datastatus and IsValid=@IsValid

if @rowcount%@pagesize>0
set @pagecount=(@rowcount/@pagesize)+1
else set @pagecount=@rowcount/@pagesize

BEGIN
select * 
from
(
select
ROWNUM=ROW_NUMBER() OVER (ORDER BY ID),
ID,
Subject,
Status,
IsValid
from dbo.CPF_Task
where DataStatus=@datastatus
 and (@IsValid is null or @IsValid =-1 or @IsValid =IsValid) 
)
as T
where T.ROWNUM BETWEEN (@currentpage*@pagesize+1)AND(@currentpage*@pagesize+@pagesize)
 END

说明:总页数和总记录数是需要输出的参数,在声明时要加上output。ROW_NUMBER()函数是SQL2005中新增的一个函数,它通常被用在分页的SQL语句中。可以理解为函数可以为表中的某个字段建立从1开始的序列。或者这样理解,这个函数根据给定的字段建立了一个新的,从1开始的数据列。from 后面的语句是将括号中select 查到的数据集暂时命名为T,然后根据这个数据集的新列和传入的当前页索引和页码大小的运算取到当前页面应该显示的记录集合。 这里还要注意括号中where条件的写法,DataStatus=@datastatus  and (@IsValid is null or @IsValid =-1 or @IsValid =IsValid) 。当存储过程中有条件查询时,例如要以主题、状态、时间、作者来查询记录时,四个条件可以自由组合查询,此时可采用(@condition is null or @condition is "" or @condition =condition)and (...)的方式来实现。

原文地址:https://www.cnblogs.com/xuezhi/p/2782869.html