分页程序的总结

基于存储过程的分页程序的总结:

1.      基于单一主键和具有能够唯一确定一行数据的属性。

2.      判断传入的参数是否合法。例如:主键或主属性、每页显示的记录数、要显示的页数等。

3.      取得总的记录数目。

4.      判断传入页数,每页记录数的合法性并修改为相对应的合法值。

5.      构建SQL语句。

 

参考如下列

CREATE PROC P_viewPage

/*

适用于单一 存在唯一的表或 ?

*/

@TableName VARCHAR(200), --表名

@FieldList VARCHAR(2000), --示列名

@PrimaryKey VARCHAR(100), --一主 ˆ½唯一 ?

@Where VARCHAR(1000), --查询条件不含'where'字符

@Order VARCHAR(1000), --排序不含'order by'字符,如id asc,userid desc,当@SortType=3生效

@SortType INT, --排序 ?1:正序asc 2:倒序desc 3:多列排序

@RecorderCount INT, --记录总0:会返回 ?

@PageSize INT, -- ?出的 ?

@PageIndex INT, --当前 ”

@TotalCount INTEGER OUTPUT, --返回 ”

@TotalPageCount INTEGER OUTPUT --返回 ?

 

AS

SET NOCOUNT ON

IF ISNULL(@TableName,'') = '' OR ISNULL(@FieldList,'') = '' 

OR ISNULL(@PrimaryKey,'') = ''

OR @SortType < 1 OR @SortType >3

OR @RecorderCount < 0 OR @PageSize < 0 OR @PageIndex < 0

BEGIN 

    RETURN

END

 

DECLARE @new_where1 VARCHAR(1000)

DECLARE @new_where2 VARCHAR(1000)

DECLARE @new_order VARCHAR(1000) 

DECLARE @Sql VARCHAR(8000)

DECLARE @SqlCount NVARCHAR(4000)

 

IF ISNULL(@where,'') = ''

    BEGIN

         SET @new_where1 = ' '

         SET @new_where2 = ' WHERE '

    END

ELSE

    BEGIN

         SET @new_where1 = ' WHERE ' + @where 

         SET @new_where2 = ' WHERE ' + @where + ' AND '

    END

--**************************************************************************************

IF ISNULL(@order,'') = '' OR @SortType = 1 OR @SortType = 2 

    BEGIN

              IF @SortType = 1 SET @new_order = ' ORDER BY ' + @PrimaryKey + ' ASC'

              IF @SortType = 2 SET @new_order = ' ORDER BY ' + @PrimaryKey + ' DESC'

    END

ELSE

    BEGIN

              SET @new_order = ' ORDER BY ' + @Order

    END

--**************************************************************************************

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

+ CAST(@PageSize AS VARCHAR)+') FROM ' + @TableName + @new_where1

--**************************************************************************************

IF @RecorderCount = 0

    BEGIN

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

              @TotalCount OUTPUT,@TotalPageCount OUTPUT

    END

ELSE

    BEGIN

              SELECT @TotalCount = @RecorderCount 

    END

--**************************************************************************************

IF @PageIndex > CEILING((@TotalCount+0.0)/@PageSize)

    BEGIN

         SET @PageIndex = CEILING((@TotalCount+0.0)/@PageSize)

         --里加一行 ?

         --print '当前页为+str(@PageIndex)

    END

--**************************************************************************************

 

IF @PageIndex = 0 or @PageIndex = 1 

--IF @PageIndex = 1    --原始行

    BEGIN

         SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ' 

         + @TableName + @new_where1 + @new_order

    END

ELSE

    BEGIN

         IF @SortType = 1

                BEGIN

                     SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ' 

                     + @TableName + @new_where2 + @PrimaryKey + ' > '

                     + '(SELECT max(' + @PrimaryKey + ') FROM (SELECT TOP '

                     + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey 

                     + ' FROM ' + @TableName

                     + @new_where1 + @new_order +' ) AS TMP) '+ @new_order

                END

         IF @SortType = 2

                BEGIN

                     SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM ' 

                     + @TableName + @new_where2 + @PrimaryKey + ' < '

                     + '(SELECT MIN(' + @PrimaryKey + ') FROM (SELECT TOP '

                     + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey 

                     +' FROM '+ @TableName

                     + @new_where1 + @new_order + ') AS TMP) '+ @new_order 

                END 

         IF @SortType = 3

                BEGIN

                     IF CHARINDEX(',',@Order) = 0

                            BEGIN

                                   RETURN

                            END

                     SET @Sql = 'SELECT TOP ' + STR(@PageSize) + ' ' + @FieldList + ' FROM '

                     + @TableName + @new_where2 + @PrimaryKey + ' NOT IN (SELECT TOP '

                     + STR(@PageSize*(@PageIndex-1)) + ' ' + @PrimaryKey

                     + ' FROM ' + @TableName + @new_where1 + @new_order + ')'

                     + @new_order

                END

    END

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值