SQL Server分页的存储过程

本文介绍了一种使用SQL Server存储过程实现高效分页查询的方法。通过动态构建SQL语句,结合TOP子句与NOT IN子句,实现了快速定位并返回指定页的数据。此外,还提供了一个测试案例,包括创建测试表、批量插入数据及调用存储过程进行验证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 


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,1NOT 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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值