SQL Server分页的存储过程

 


ALTER   Procedure   [ dbo ] . [ QuickPage ]
@strTableName      varchar ( 50 ),     -- 表名
@strFieldList      varchar ( 1000 ),     -- 所要查询的字段序列
@strWhereFilter      varchar ( 1000 ),     -- 查询条件
@strOrderField      varchar ( 1000 ),     -- 排序字段
@strKeyField      varchar ( 50 ),     -- 用来分页的关键字段名
@intPageSize      int ,             -- 每页记录数
@intPageIndex      int ,             -- 当前所要查询的页
@intPageCount      int  output,         -- 总页数
@intRecordCount      int     output         -- 总记录数
as

declare    @sql              nvarchar ( 4000 )     -- 用于构造SQL语句
declare    @beginIndex      int                  -- 起始记录数
declare    @residualNum      int                  -- 余数
begin
-- 构造SQL语句计算总记录数
if   @strWhereFilter   is   null   or   @strWhereFilter   =   ''
    
set   @sql = ' SELECT @intRecordCount=count(*) from  '   +   @strTableName
else
    
set   @sql = ' SELECT @intRecordCount=count(*) from  '   +   @strTableName   + '  where  '   +   @strWhereFilter    
-- 执行SQL语句计算总记录数,并将其放入@intRecordCount变量中
exec  sp_executesql  @sql ,N ' @intRecordCount int output ' , @intRecordCount  output
-- 计算出总页数
set   @residualNum      =   @intRecordCount   %   @intPageSize
if   @residualNum   =   0
    
set   @intPageCount   =   @intRecordCount   /   @intPageSize
else
    
set   @intPageCount   =  ( @intRecordCount   /   @intPageSize +   1

set   @strFieldList      =   @strFieldList   + ' , ' +   cast ( @intPageCount   as   varchar +   '  as PageCount, ' + cast ( @intRecordCount   as   varchar + '  as RecordCount '
begin
    
if   @intPageIndex   =   1
        
begin
            
if   @strWhereFilter   is   null   or   @strWhereFilter   =   ''  
                
begin
                    
if   @strOrderField   is   null   or   @strOrderField   =   ''
                        
set   @sql   =   ' SELECT TOP  ' +   cast ( @intPageSize   as   varchar + '   ' +   @strFieldList   + '  FROM  ' +   @strTableName
                    
else
                        
set   @sql   =   ' SELECT TOP  ' +   cast ( @intPageSize   as   varchar + '   ' +   @strFieldList   + '  FROM  ' +   @strTableName   + '  ORDER BY  ' +   @strOrderField
                
end
            
else
                
begin
                    
if   @strOrderField   is   null   or   @strOrderField   =   ''
                        
set   @sql   =   ' SELECT TOP  ' +   cast ( @intPageSize   as   varchar + '   ' +   @strFieldList   + '  FROM  ' +   @strTableName   + '  where  ' +   @strWhereFilter
                    
else
                        
set   @sql   =   ' SELECT TOP  ' +   cast ( @intPageSize   as   varchar + '   ' +   @strFieldList   + '  FROM  ' +   @strTableName   + '  where  ' +   @strWhereFilter   + '  ORDER BY  ' + @strOrderField
                
end
        
end
    
else
        
begin
            
-- 计算出开始记录位置
             set   @beginIndex          =  ( @intPageIndex   -   1 *   @intPageSize  
            
if   @strWhereFilter   is   null   or   @strWhereFilter   =   ''  
                
begin
                    
if   @strOrderField   is   null   or   @strOrderField   =   ''
                        
set   @sql   =   ' SELECT TOP  ' +   cast ( @intPageSize   as   varchar + '   ' +   @strFieldList   + '  FROM  ' +   @strTableName   + '  WHERE  ' +   @strKeyField   + '  NOT IN (SELECT TOP  ' +   cast ( @beginIndex   as   varchar + '   ' +   @strKeyField   + '  FROM  ' +   @strTableName   + ' ) '
                    
else
                        
set   @sql   =   ' SELECT TOP  ' +   cast ( @intPageSize   as   varchar + '   ' +   @strFieldList   + '  FROM  ' +   @strTableName   + '  WHERE  ' +   @strKeyField   + '  NOT IN (SELECT TOP  ' +   cast ( @beginIndex   as   varchar + '   ' +   @strKeyField   + '  FROM  ' +   @strTableName   + '  ORDER BY  ' + @strOrderField + ' ) ORDER BY  ' + @strOrderField
                
end
            
else
                
begin
                    
if   @strOrderField   is   null   or   @strOrderField   =   ''
                        
set   @sql   =   ' SELECT TOP  ' +   cast ( @intPageSize   as   varchar + '   ' +   @strFieldList   + '  FROM  ' +   @strTableName   + '  WHERE  ' +   @strKeyField   + '  NOT IN (SELECT TOP  ' +   cast ( @beginIndex   as   varchar + '   ' +   @strKeyField   + '  FROM  ' +   @strTableName   + '  where  ' +   @strWhereFilter   + ' ) '
                    
else
                        
set   @sql   =   ' SELECT TOP  ' +   cast ( @intPageSize   as   varchar + '   ' +   @strFieldList   + '  FROM  ' +   @strTableName   + '  WHERE  ' +   @strKeyField   + '  NOT IN (SELECT TOP  ' +   cast ( @beginIndex   as   varchar + '   ' +   @strKeyField   + '  FROM  ' +   @strTableName   + '  where  ' +   @strWhereFilter   + '  ORDER BY  ' + @strOrderField + ' ) ORDER BY  ' + @strOrderField
                
end
        
end
end
exec ( @sql )  
end

 

 测试

1、生成测试表:

USE   [ SchoolWebData ]
GO
/****** 对象:  Table [dbo].[TestTable]    脚本日期: 10/31/2006 15:09:46 ******/
SET  ANSI_NULLS  ON
GO
SET  QUOTED_IDENTIFIER  ON
GO
CREATE   TABLE   [ dbo ] . [ TestTable ] (
    
[ ID ]   [ int ]   IDENTITY ( 1 , 1 NOT   NULL ,
    
[ FirstName ]   [ nvarchar ] ( 100 ) COLLATE Chinese_PRC_CI_AS  NULL ,
    
[ LastName ]   [ nvarchar ] ( 100 ) COLLATE Chinese_PRC_CI_AS  NULL ,
    
[ Country ]   [ nvarchar ] ( 50 ) COLLATE Chinese_PRC_CI_AS  NULL ,
    
[ Note ]   [ nvarchar ] ( 2000 ) COLLATE Chinese_PRC_CI_AS  NULL
ON   [ PRIMARY ]

2、插入测试记录(20000W条)

SET   IDENTITY_INSERT  TestTable  ON

declare   @i   int
set   @i = 1
while   @i <= 20000
begin
    
insert   into  TestTable( [ id ] , FirstName, LastName, Country,Note)  values ( @i ' FirstName_XXX ' , ' LastName_XXX ' , ' Country_XXX ' , ' Note_XXX ' )
    
set   @i = @i + 1
end

SET   IDENTITY_INSERT  TestTable  OFF

3、测试存储过程

USE   [ SchoolWebData ]
GO

DECLARE      @return_value   int ,
        
@intPageCount   int ,
        
@intRecordCount   int

EXEC      @return_value   =   [ dbo ] . [ QuickPage ]
        
@strTableName   =  N ' TestTable ' ,
        
@strFieldList   =  N ' * ' ,
        
@strWhereFilter   =  N ' 0=0 ' ,
        
@strOrderField   =  N ' id ' ,
        
@strKeyField   =  N ' id ' ,
        
@intPageSize   =   15 ,
        
@intPageIndex   =   10 ,
        
@intPageCount   =   @intPageCount  OUTPUT,
        
@intRecordCount   =   @intRecordCount  OUTPUT

SELECT      @intPageCount   as  N ' @intPageCount ' ,
        
@intRecordCount   as  N ' @intRecordCount '

SELECT      ' Return Value '   =   @return_value

GO

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值