sql存储过程分页 狼

CREATE PROCEDURE sp_page
  @tb         varchar(50), --表名
  @col        varchar(
50), --按该列来进行分页
  @coltype    
int,         --@col列的类型,0-数字类型,1-字符类型,2-日期时间类型
  @orderby    bit,         
--排序,0-顺序,1-倒序
  @collist    varchar(
800),--要查询出的字段列表,*表示全部字段
  @pagesize   
int,         --每页记录数
  @CurrentPage       
int,         --指定页
  @Where  varchar(
800),--查询条件
  @PageCount      
int OUTPUT   --总页数
  
AS

DECLARE @sql nvarchar(
4000),@where1 varchar(800),@where2 varchar(800)
IF @Where 
is null or rtrim(@Where)=''
BEGIN
--没有查询条件
  SET @where1
=' WHERE '
  SET @where2
='  '
END
ELSE
BEGIN
--有查询条件
  SET @where1
=' WHERE ('+@Where+') AND '--本来有条件再加上此条件
  SET @where2
=' WHERE ('+@Where+''--原本没有条件而加上此条件
END
SET @sql
='SELECT @PageCount=CEILING((COUNT(*)+0.0)/'+CAST(@pagesize AS varchar)+
         
') FROM '+@tb+@where2
EXEC sp_executesql @sql,N
'@PageCount int OUTPUT',@PageCount OUTPUT--计算总页数
IF @orderby
=0
  SET @sql
='SELECT TOP '+CAST(@pagesize AS varchar)+' '+@collist+
           
' FROM '+@tb+@where1+@col+'>(SELECT MAX('+@col+''+
           
' FROM (SELECT TOP '+CAST(@pagesize*(@CurrentPage-1) AS varchar)+' '+
           @col
+' FROM '+@tb+@where2+'ORDER BY '+@col+') t) ORDER BY '+@col
ELSE
  SET @sql
='SELECT TOP '+CAST(@pagesize AS varchar)+' '+@collist+
           
' FROM '+@tb+@where1+@col+'<(SELECT MIN('+@col+''+
           
' FROM (SELECT TOP '+CAST(@pagesize*(@CurrentPage-1) AS varchar)+' '+
           @col
+' FROM '+@tb+@where2+'ORDER BY '+@col+' DESC) t) ORDER BY '+
           @col
+' DESC'
IF @CurrentPage
=1--第一页
  SET @sql
='SELECT TOP '+CAST(@pagesize AS varchar)+' '+@collist+' FROM '+@tb+
    @where2
+'ORDER BY '+@col+CASE @orderby WHEN 0 THEN '' ELSE ' DESC' END
EXEC(@sql)
GO

GRANT EXEC ON sp_page TO PUBLIC

GO
原文地址:https://www.cnblogs.com/gowhy/p/2105063.html