两种分页存储过程的写法
分页对不同的系统要求不同,就其本身来说,可简可繁。但对于数据量比较大的,就得考虑服务器的承载能力和查询效率了,下面两种方法供参考。
一种是SQL自带的函数实现分页
代码如:
ALTER PROCEDURE [dbo].[getPageNum]
@pageSize int, --页大小
@pageNum int, --第几页
@Where nvarchar(1000)=' where 1=1 '
AS
declare @start int, --开始页
@end int, --结束页
@temp nvarchar(1000) --临时的SQL语句
BEGIN
set @start=@pageSize*(@pageNum-1)+1 --从第几页开始
set @end=@pageSize*@pageNum --从第几页结束
set @temp='select * from(select Number=Row_Number() over (order by ID),* from Users) as A where A.Number between '+convert(varchar(10),@start)+' and '+CONVERT(varchar(10),@end)+' '
exec(@temp)
END
另外一种按照自己需要的表,输出相应的总页数和总条数的分页
代码如下:
ALTER PROC [dbo].[thk_up_PageToNum]
@TableName NVARCHAR(55),--页执行分页的表名字
@TableIdName NVARCHAR(512), --这个是要查询的表的ID名称
@TableListName NVARCHAR(1000)=' * ',--要查的列明
@SelectWhere NVARCHAR(2000)='',--查询的条件
@SelectOrderBy NVARCHAR(100)='', --排序方式
@IndexPage INT=1,--要跳转的页数,第几页
@TopCounts INT =10, --每个页面多少条数据
@AllPageCount INT OUTPUT,--总页数
@AllCounts INT OUTPUT--总条数
AS
DECLARE @sqls NVARCHAR(4000) --先判断是否有条件
IF(@SelectWhere='')BEGIN
SET @SelectWhere=' WHERE 1=1 '
END
ELSE
SET @SelectWhere= ' where '+@SelectWhere
--PRINT @SelectWhere
-- 注意,在拼接字符串的时候,必须要将INT类型的转化为VARCHAR类型的。
SET @sqls='SELECT @AllPageCount=CEILING( (COUNT(*)+0.0)/'+CAST(@TopCounts AS varchar)+') FROM '+ @TableName +@SelectWhere
EXEC sp_executesql @sqls,N'@AllPageCount int OUTPUT',@AllPageCount OUTPUT ---计算总页数的
--条数
SET @sqls='SELECT @AllCounts=COUNT(*) FROM '+ @TableName + @SelectWhere
EXEC sp_executesql @sqls,N'@AllCounts int OUTPUT',@AllCounts OUTPUT ---计算总条数的
IF(@TableListName='')
SET @TableListName=' * '
---这个是当前页的数据
IF(@IndexPage=1)
BEGIN
SET @sqls=' SELECT TOP '+CAST(@TopCounts AS varchar)+' '+@TableListName+' FROM ' +@TableName+@SelectWhere+' '+@SelectOrderBy --' and '+@TableIdName+' not IN (SELECT TOP ('+CAST(@TopCounts AS varchar) --+'*('+CAST(@IndexPage AS varchar)+'-1)) '+@TableIdName +' FROM '+@TableName+@SelectWhere+') ' --+@SelectOrderBy --PRINT @sqls END SET @sqls=' SELECT TOP '+CAST(@TopCounts AS varchar)+' '+@TableListName+' FROM ' +@TableName+@SelectWhere+' and '+@TableIdName+' not IN (SELECT TOP ('+CAST(@TopCounts AS varchar) +'*('+CAST(@IndexPage AS varchar)+'-1)) '+@TableIdName +' FROM '+@TableName+@SelectWhere+' '+@SelectOrderBy+') '+@SelectOrderBy
--PRINT @sqls
EXEC(@sqls)
--return(@AllCounts)