我的编程空间,编程开发者的网络收藏夹
学习永远不晚

几种分页存储过程

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

几种分页存储过程

过程一:

select top N条记录 * from 文章表 where id not in(select top M条记录 id from 文章表 order by id desc ) order by id desc


过程二:

select top N条记录 * from 文章表 where id <(select min(id) from (select top M条记录 id from 文章表 order by id desc ) as tblTmp) order by id desc


--简单通用

CREATE PROCEDURE [dbo].[PageView]

    @select VARCHAR(max),

    @CurrentPage INT,

    @PageSize INT

AS

BEGIN

    declare @sql NVARCHAR(max)

    DECLARE @RecordCurrent INT

    DECLARE @PageCount INT

    DECLARE @RecordCount INT

    SET NOCOUNT ON

    set @sql='select @RecordCount=count(*) from ('+@select+') a'

    exec sp_executesql @sql,N'@RecordCount int output',@RecordCount output

    SET @PageCount=(@RecordCount+@PageSize-1)/@PageSize

    IF ISNULL(@CurrentPage,0)<1

        SET @CurrentPage=1

    ELSE if ISNULL(@CurrentPage,0)>@PageCount

        SET @CurrentPage=@PageCount

    SELECT @CurrentPage AS CurrentPage,@RecordCount AS RecordCount,@PageSize AS PageSize,@PageCount AS PageCount

    set @sql='select * from ('+@select+') a where rownumber between '+cast((@CurrentPage-1)*@PageSize+1 as varchar)+' and '+cast(@CurrentPage*@PageSize as varchar)

    exec (@sql)

END

--使用not in 方式的存储过程

create PROCEDURE GetPageDataByNotIn

@PageIndex int, 

@PageSize int 

AS

declare @starttime datetime

    set @starttime=getdate()

IF @PageIndex > 0

BEGIN

set nocount on;

DECLARE @PageLowerBound int

DECLARE @StartID int

DECLARE @sql varchar(225)

SET @PageLowerBound = @PageSize * (@PageIndex-1)

IF @PageLowerBound<1

   SET @PageLowerBound=1

    print @PageLowerBound

select top (@PageSize) * from table where [ar_id] not in (select top ((@PageSize)*(@PageIndex-1)) ar_id from table )

EXEC(@sql)

set nocount off; 

END

print '耗时='+convert(varchar(30),datediff(ms,@starttime,getdate()))

-------------------------------------------------------------------------------------------------------

--使用ROWCOUNT的分页存储过程

create PROCEDURE GetPageData

@PageIndex int, 

@PageSize int 

AS

declare @starttime datetime

    set @starttime=getdate()

IF @PageIndex > 0

BEGIN

set nocount on;

DECLARE @PageLowerBound int

DECLARE @StartID int

DECLARE @sql varchar(225)

SET @BeginIndex = @PageSize * (@PageIndex-1)

IF @BeginIndex<1

   SET @BeginIndex=1

SET ROWCOUNT @BeginIndex

SELECT @StartID = [ar_id] FROM table ORDER BY ar_id 

print @StartID

SET ROWCOUNT 0

SET @sql='select top '+str(@PageSize) +' * from table where [ar_id]>='+ str(@StartID) +' ORDER BY [ar_id] '

EXEC(@sql)

set nocount off; 

END

print '耗时='+convert(varchar(30),datediff(ms,@starttime,getdate()))


-----------------------------------------------------------------------------------------------------

测试查询一张有100W条数据的表table,每页显示10条数据

存储过程                        第1页   第10页   第100页   第1000页   第5000页   

GetPageDataByNotIn    0           0            126           13530       等了2分多钟没耐性了....

GetPageData                0           0            0               16              76


------------------------------------------------------------------------------------------------------------

最后使用的存储过程(推荐):

create PROCEDURE GetPageData

(

@TableName varchar(30),--表名称

@IDName varchar(20),--表主键名称

@PageIndex int,--当前页数 

@PageSize int--每页大小 

)

AS

IF @PageIndex > 0

BEGIN

set nocount on

   DECLARE @PageLowerBound int,@StartID int,@sql nvarchar(225)

   SET @PageLowerBound = @PageSize * (@PageIndex-1)

   IF @PageLowerBound<1

    SET @PageLowerBound=1

   SET ROWCOUNT @PageLowerBound

   SET @sql=N'SELECT @StartID = ['+@IDName+'] FROM '+@TableName+' ORDER BY '+@IDName

     exec sp_executesql @sql,N'@StartID int output',@StartID output

   SET ROWCOUNT 0

   SET @sql='select top '+str(@PageSize) +' * from '+@TableName+' where ['+@IDName+']>='+ str(@StartID) +' ORDER BY ['+@IDName+'] '

   EXEC(@sql)

set nocount off

END


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

几种分页存储过程

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

sqlserver分页存储过程

sqlserver 单表(视图)通用分页存储过程create procedure proc_getpage@table_name varchar(100), --表名(视图)@select_fields varchar(1000)="
2019-07-22

Oracle存储过程的几种调用方式图文详解

目录一编程客栈、案例场景1.基础环境2.SQL窗口中调用存储过程3.命令窗口中调用存储过程4.Procedures菜单列表中调用存储过程5.Package或Package Bodies菜单列表中调用存储过程6.Jobs菜单列表调用存储过程7
2023-04-14

mysql存储过程中错误处理有哪几种类型

mysql 存储过程错误处理提供以下几种类型:begin...end 块:发生错误时回滚事务,不执行后续语句。error 语句:手动引发错误,指定错误代码和消息。signal 语句:从自定义错误处理例程引发错误,发送错误代码和消息。hand
mysql存储过程中错误处理有哪几种类型
2024-04-22

ASP.NET中怎么利用存储过程实现分页

ASP.NET中怎么利用存储过程实现分页,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、首先看下页面前台代码<%@ Page Language="C#" AutoEven
2023-06-17

hive存储格式有几种

这篇文章主要介绍了hive存储格式有几种,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。hive的存储格式通常是三种:textfile 、 sequencefile 、 rcf
2023-06-02

sql存储过程几个简单例子

1. 创建一个简单的存储过程,返回所有顾客的数量:```sqlCREATE PROCEDURE GetCustomerCountASBEGINSELECT COUNT(*) AS CustomerCount FROM Customers;E
2023-09-22

编程热搜

目录