加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 13:47:44 所属栏目:MsSql教程 来源:网络整理
导读: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' ,-- 排序的字段

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,'','id'
EXEC  dbo.page 'RGraph',2,4,5,'id'
--返回总数量
EXEC  dbo.page 'RGraph',6,'id'

结果如图:

这里写图片描述

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读