SqlServer2005海量数据存储过程分页(上)

56 篇文章 1 订阅
56 篇文章 0 订阅

/************************************************************

 * 对数据进行了分处理使查询前半部分数据与查询后半部分数据性能相同

 ************************************************************/

 

ALTER PROCEDURE Proc_QB_Pager(

    @tblName       NVARCHAR(200), ----要显示的表或多个表的连接

    @fldName       NVARCHAR(500) = '*', ----要显示的字段列表

    @pageSize      INT = 10, ----每页显示的记录个数

    @page          INT = 1, ----要显示那一页的记录

    @fldSort       NVARCHAR(200) = NULL, ----排序字段列表或条件

    @Sort          BIT = 0, ----排序方法,为升序,为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ') 

    @strCondition  NVARCHAR(1000) = NULL, ----查询条件,不需where 

    @ID            NVARCHAR(150), ----主表的主键

    @Dist          BIT = 0, ----是否添加查询字段的DISTINCT 默认不添加/1添加

    @pageCount     INT = 1 OUTPUT, ----查询结果分页后的总页数

    @Counts        INT = 1 OUTPUT ----查询到的记录数

)

AS

SET NOCOUNT ON 

DECLARE @sqlTmp NVARCHAR(1000) ----存放动态生成的SQL语句

DECLARE @strTmp NVARCHAR(1000) ----存放取得查询结果总数的查询语句

DECLARE @strID NVARCHAR(1000) ----存放取得查询开头或结尾ID的查询语句

 

DECLARE @strSortType NVARCHAR(10) ----数据排序规则A 

DECLARE @strFSortType NVARCHAR(10) ----数据排序规则B 

 

DECLARE @SqlSelect NVARCHAR(50) ----对含有DISTINCT的查询进行SQL构造

DECLARE @SqlCounts NVARCHAR(50) ----对含有DISTINCT的总数查询进行SQL构造

 

DECLARE @timediff DATETIME --耗时测试时间差

SELECT @timediff = GETDATE() 

 

IF @Dist = 0

BEGIN

    SET @SqlSelect = 'select ' 

    SET @SqlCounts = 'Count(*)'

END

ELSE

BEGIN

    SET @SqlSelect = 'select distinct ' 

    SET @SqlCounts = 'Count(DISTINCT ' + @ID + ')'

END 

 

 

IF @Sort = 0

BEGIN

    SET @strFSortType = ' ASC ' 

    SET @strSortType = ' DESC '

END

ELSE

BEGIN

    SET @strFSortType = ' DESC ' 

    SET @strSortType = ' ASC '

END 

 

 

 

--------生成查询语句--------

--此处@strTmp为取得查询结果数量的语句

IF @strCondition IS NULL

   OR @strCondition = '' --没有设置显示条件

BEGIN

    SET @sqlTmp = @fldName + ' From ' + @tblName 

    SET @strTmp = @SqlSelect + ' @Counts=' + @SqlCounts + ' FROM ' + @tblName 

    SET @strID = ' From ' + @tblName

END

ELSE

BEGIN

    SET @sqlTmp = + @fldName + 'From ' + @tblName + ' where (1>0) ' + @strCondition 

    SET @strTmp = @SqlSelect + ' @Counts=' + @SqlCounts + ' FROM ' + @tblName 

        + ' where (1>0) ' + @strCondition

    

    SET @strID = ' From ' + @tblName + ' where (1>0) ' + @strCondition

END 

 

----取得查询结果总数量----- 

EXEC sp_executesql @strTmp,

     N'@Counts int out ',

     @Counts OUT

 

DECLARE @tmpCounts INT 

IF @Counts = 0

    SET @tmpCounts = 1

ELSE

    SET @tmpCounts = @Counts 

 

--取得分页总数

SET @pageCount = (@tmpCounts + @pageSize -1) / @pageSize 

 

/**//**当前页大于总页数取最后一页**/ 

IF @page > @pageCount

    SET @page = @pageCount 

 

--/*-----数据分页分处理-------*/ 

DECLARE @pageIndex INT --总数/页大小

DECLARE @lastcount INT --总数%页大小 

 

SET @pageIndex = @tmpCounts / @pageSize 

SET @lastcount = @tmpCounts%@pageSize 

IF @lastcount > 0

    SET @pageIndex = @pageIndex + 1

ELSE

    SET @lastcount = @pagesize 

 

--//***显示分页

IF @strCondition IS NULL

   OR @strCondition = '' --没有设置显示条件

BEGIN

    IF @pageIndex < 2

       OR @page <= @pageIndex / 2 + @pageIndex % 2 --前半部分数据处理

    BEGIN

        IF @page = 1

            SET @strTmp = @SqlSelect + ' top ' + CAST(@pageSize AS VARCHAR(4))

                + ' ' + @fldName + ' from ' + @tblName 

                + ' order by ' + @fldSort + ' ' + @strFSortType

        ELSE

        BEGIN

            IF @Sort = 1

            BEGIN

                SET @strTmp = @SqlSelect + ' top ' + CAST(@pageSize AS VARCHAR(4))

                    + ' ' + @fldName + ' from ' + @tblName 

                    + ' where ' + @ID + ' <(select min(' + @ID + ') from (' + 

                    @SqlSelect + ' top ' + CAST(@pageSize * (@page -1) AS VARCHAR(20)) 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值