两种分页存储过程的写法

分页对不同的系统要求不同,就其本身来说,可简可繁。但对于数据量比较大的,就得考虑服务器的承载能力和查询效率了,下面两种方法供参考。

一种是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)

原文地址:https://www.cnblogs.com/hxbg/p/proc.html