几种分页存储过程
admin
2023-06-02 19:22:00
0

过程一:

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


相关内容

热门资讯

华为申请通信方法专利,有效地避... 国家知识产权局信息显示,华为技术有限公司申请一项名为“通信方法、装置及存储介质”的专利,公开号CN1...
【平凡岗位 精彩人生】厦门黄洪... 从职场小白到技术攻坚,从技术助理到产品工程师的跨越,是一段用数据镌刻的进阶之路。他说:“也许永远没人...
特朗普与国家安全团队举行会议,... 当地时间5月22日,美国总统特朗普在纽约发布讲话时表示,伊朗绝不会拥有核武器,“此事很快就会结束”。...
山西沁源一煤矿发生事故已致4死... 记者从山西沁源县获悉,22晚9时43分接报,山西通洲集团留神峪煤矿井下一氧化碳传感器发出超限报警,当...
海目星获得发明专利授权:“撕取... 证券之星消息,根据天眼查APP数据显示海目星(688559)新获得一项发明专利授权,专利名为“撕取机...
乌尔善《郑和下西洋》宝船模型亮... 第二十二届中国(深圳)国际文化产业博览交易会于5月21日在深圳国际会展中心举行。华夏电影发行有限责任...
1245种脊椎动物+500种昆... 5月22日,由中国科学院昆明动物研究所牵头、汇聚几代科研工作者心血编撰的高黎贡山生物多样性丛书在昆明...
普京称乌袭击卢甘斯克学校致6死... 俄罗斯总统普京5月22日表示,乌克兰使用16架无人机分三波于当天凌晨袭击了卢甘斯克地区一所学校,导致...
伊朗外交部发言人:伊美分歧严重... 新华社德黑兰5月22日电 伊朗外交部发言人巴加埃22日表示,当前无法断言伊美协议已接近达成,双方分歧...
浓缩铀该去还是留?美伊要打还是... 当前,美伊双方正针对伊朗浓缩铀的去留问题、未来双方是重新开战还是再次谈判等问题展开了博弈。21日,美...