SqlServer存储过程分页代码(支持亿万庞大数据量)

Sql语句如下

USE [Test]

go

SET ansi_nulls ON

go

SET quoted_identifier ON

go

ALTER PROCEDURE [dbo].[Page] @tblName      VARCHAR(255),-- 表名
                             @strGetFields VARCHAR(1000) = '*', -- 需要返回的列
                             @fldName      VARCHAR(255)='id', -- 排序的字段名
                             @PageSize     INT = 10,-- 页尺寸
                             @PageIndex    INT = 1,-- 页码
                             @doCount      BIT = 0, -- 返回记录总数, 非 0 值则返回
                             @OrderType    BIT = 0, -- 设置排序类型, 非 0 值则降序 0:asc 1:desc
                             @strWhere     VARCHAR(1500) = '', -- 查询条件 (注意: 不要加 where)
                             @ID           NVARCHAR(50)='id'--主表的列。。最好是主键
AS
    DECLARE @strSQL VARCHAR(5000) -- 主语句
    DECLARE @strTmp VARCHAR(110) -- 临时变量
    DECLARE @strOrder VARCHAR(400) -- 排序类
    IF @doCount != 0
      BEGIN
          IF @strWhere != ''
            SET @strSQL = 'select count(*) as Total from ' + @tblName + ' where ' + @strWhere
          ELSE
            SET @strSQL = 'select count(*) as Total from ' + @tblName + ''
      END
    --以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount0的情况
    ELSE
      BEGIN
          IF @OrderType != 0
            BEGIN
                SET @strTmp = '<(select min'
                SET @strOrder = ' order by ' + @fldName + ' desc' --如果@OrderType不是0,就执行降序,这句很重要!
            END
          ELSE
            BEGIN
                SET @strTmp = '>(select max'
                SET @strOrder = ' order by ' + @fldName + ' asc'
            END

          IF @PageIndex = 1
            BEGIN
                IF @strWhere != ''
                  SET @strSQL = 'select top ' + Str(@PageSize) + ' '
                                + @strGetFields + ' from ' + @tblName +
                                ' where '
                                + @strWhere + ' ' + @strOrder
                ELSE
                  SET @strSQL = 'select top ' + Str(@PageSize) + ' '
                                + @strGetFields + ' from ' + @tblName + ' '
                                + @strOrder
            --如果是第一页就执行以上代码,这样会加快执行速度
            END
          ELSE
            BEGIN
                --以下代码赋予了@strSQL以真正执行的SQL代码
                SET @strSQL = 'select top ' + Str(@PageSize) + ' '
                              + @strGetFields + ' from ' + @tblName + ' where '
                              + @fldName + ' ' + @strTmp + '( ' + @ID
                              + ' ) from (select top '
                              + Str((@PageIndex-1)*@PageSize) + ' '
                              + @fldName + ' from ' + @tblName + @strOrder
                              + ') as tblTmp)' + @strOrder

                IF @strWhere != ''
                  SET @strSQL = 'select top ' + Str(@PageSize) + ' '
                                + @strGetFields + ' from ' + @tblName +
                                ' where '
                                + @fldName + ' ' + @strTmp + '(' + @ID
                                + ') from (select top '
                                + Str((@PageIndex-1)*@PageSize) + ' '
                                + @fldName + ' from ' + @tblName + ' where '
                                + @strWhere + ' ' + @strOrder +
                                ') as tblTmp) and '
                                + @strWhere + ' ' + @strOrder
            END
      END

    PRINT ( @strSQL )

    EXEC (@strSQL)  

执行存储过程如下:

EXEC  dbo.page 'RGraph','*','id',3,1,0,1,'','id'
EXEC  dbo.page 'RGraph','*','id',3,2,0,1,'','id'
EXEC  dbo.page 'RGraph','*','id',3,3,0,1,'','id'
EXEC  dbo.page 'RGraph','*','id',3,4,0,1,'','id'
EXEC  dbo.page 'RGraph','*','id',3,5,0,1,'','id'
--返回总数量
EXEC  dbo.page 'RGraph','*','id',3,6,1,1,'','id'

结果如图:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值