zl程序教程

您现在的位置是:首页 >  数据库

当前栏目

mssql高效的分页存储过程分享

存储 mssql 高效 分享 过程 分页
2023-06-13 09:14:47 时间

最近在做一个几百万条数据的分页查询,研究了各种方案,在本机上用项目的实际数据库做测试,测试过程isvery痛苦,不堪回首ing。现在废话不多说,直接上结果,相信这也是大多数搜索答案的人最愿意看的方式。

  以下是存储过程的代码:

复制代码代码如下:


CREATEPROCEDURE[dbo].[P_GridViewPager](
    @recordTotalINTOUTPUT,           --输出记录总数
    @viewNameVARCHAR(800),            --表名
    @fieldNameVARCHAR(800)="*",     --查询字段
    @keyNameVARCHAR(200)="Id",      --索引字段
    @pageSizeINT=20,                --每页记录数
    @pageNoINT=1,                    --当前页
    @orderStringVARCHAR(200),         --排序条件
    @whereStringVARCHAR(800)="1=1"  --WHERE条件
)
 AS
 BEGIN
     DECLARE@beginRowINT
     DECLARE@endRowINT
     DECLARE@tempLimitVARCHAR(200)
     DECLARE@tempCountNVARCHAR(1000)
     DECLARE@tempMainVARCHAR(1000)
     --declare@timediffdatetime

     setnocounton
     --select@timediff=getdate()--记录时间

     SET@beginRow=(@pageNo-1)*@pageSize   +1
     SET@endRow=@pageNo*@pageSize
     SET@tempLimit="rowsBETWEEN"+CAST(@beginRowASVARCHAR)+"AND"+CAST(@endRowASVARCHAR)

     --输出参数为总记录数
     SET@tempCount="SELECT@recordTotal=COUNT(*)FROM(SELECT"+@keyName+"FROM"+@viewName+"WHERE"+@whereString+")ASmy_temp"
     EXECUTEsp_executesql@tempCount,N"@recordTotalINTOUTPUT",@recordTotalOUTPUT

     --主查询返回结果集
     SET@tempMain="SELECT*FROM(SELECTROW_NUMBER()OVER(orderby"+@orderString+")ASrows,"+@fieldName+"FROM"+@viewName+"WHERE"+@whereString+")ASmain_tempWHERE"+@tempLimit

     --PRINT@tempMain
     EXECUTE(@tempMain)
     --selectdatediff(ms,@timediff,getdate())as耗时

     setnocountoff
 END

 GO