SQL分页存储过程(不支持多表联合查询,不支持多字段排序)

CREATE PROCEDURE [dbo].[Pro_GetPageOfRecords]

@PageSize   INT=20,            --分页大小

@CurrentPage INT,              --第几页

@Clumns  VARCHAR(1000)='*',    --需要得到的字段

@TableName VARCHAR(100),       --需要查询的表

@Condition VARCHAR(1000)='',   --查询条件,不用加Where关键字

@AscColumn VARCHAR(100)='',    --排序的字段名(即order by column asc/desc)

@BitOrderType BIT=0,           --排序类型(0为升序,1为降序)

@PkColumn VARCHAR(50)='',      --主键名称,不可为空  

@TotalCount INT OUTPUT ,       --记返回总记录          

@TotalPageCount INT OUTPUT     --返回总页数         

AS

BEGIN

	DECLARE @strSql VARCHAR(5000)           --分页语句 

	DECLARE @strOrderType VARCHAR(1000)     --排序类型语句 

    DECLARE @SqlCount NVARCHAR(4000)   	    --记录数语句

    DECLARE @new_where VARCHAR(1000)        --查询条件

    ----Where条件处理-------------   	

     IF @Condition!=''

        BEGIN          

           SET @new_where = ' Where ' + @Condition                   

        END 

      ELSE

        BEGIN

            SET @new_where = ' Where 1=1'  

        END      

     ----------总记录数查询---------------

     SET @SqlCount = 'Select @TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/'          

    +STR(@PageSize)+') FROM (Select * FROM ' + @TableName + @new_where+') AS T'                 

        BEGIN          

            EXEC SP_EXECUTESQL @SqlCount,N'@TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT',       

            @TotalCount OUTPUT,@TotalPageCount OUTPUT          

        END    

    --------------排序处理------------      

	 IF	@BitOrderType=1   --降序

	 	BEGIN

	 	    IF	@AscColumn!=''   

	 		SET @strOrderType=' ORDER BY '+@AscColumn+' DESC'

	 	    ELSE	

	 	    SET @strOrderType=' ORDER BY '+@PkColumn+' DESC'

	    END

	 ELSE  

	   BEGIN

	   IF	@AscColumn!=''

	     SET @strOrderType=' ORDER BY '+@AscColumn+' ASC'

	    ELSE	

	     SET @strOrderType=' ORDER BY '+@PkColumn+' ASC'

	   END   

-----------------分页处理--------------------

	IF @CurrentPage=1     --第一页

	   BEGIN

		  SET @strSql='SELECT TOP '+STR(@PageSize)+''+@Clumns+' FROM'+ @TableName + @new_where+@strOrderType

       END	 

     ELSE               --其他页

       BEGIN

		  set @strsql = 'SELECT TOP '+STR(@PageSize)+' '+@Clumns+' FROM '+ @TableName + @new_where+' AND ('+@PkColumn+' NOT IN (SELECT TOP '+STR((@PageSize-1)*@PageSize)+' '+@PkColumn+' FROM '+@TableName+''+@Condition+@strOrderType+'))'+@strOrderType

       END

       

     EXEC (@strSql)

END

 

你可能感兴趣的:(存储过程)