mssql 高效的分页存储过程分享
2022-11-12 09:45:10
内容摘要
这篇文章主要为大家详细介绍了mssql 高效的分页存储过程分享,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记!
最近在做一个几百万条数据的
文章正文
这篇文章主要为大家详细介绍了mssql 高效的分页存储过程分享,具有一定的参考价值,可以用来参考一下。
对此感兴趣的朋友,看看idc笔记做的技术笔记!
最近在做一个几百万条数据的分页查询,研究了各种方案,在本机上用项目的实际数据库做测试,测试过程 is very 痛苦,不堪回首ing。现在废话不多说,直接上结果,相信这也是大多数搜索答案的人最愿意看的方式。
以下是存储过程的代码:
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | <code>CREATE PROCEDURE [dbo].[P_GridViewPager] ( @recordTotal INT OUTPUT, --输出记录总数 @viewName VARCHAR(800), --表名 @fieldName VARCHAR(800) = '*' , --查询字段 @keyName VARCHAR(200) = 'Id' , --索引字段 @pageSize INT = 20, --每页记录数 @pageNo INT =1, --当前页 @orderString VARCHAR(200), --排序条件 @whereString VARCHAR(800) = '1=1' --WHERE条件 ) AS BEGIN DECLARE @beginRow INT DECLARE @endRow INT DECLARE @tempLimit VARCHAR(200) DECLARE @tempCount NVARCHAR(1000) DECLARE @tempMain VARCHAR(1000) -- declare @timediff datetime set nocount on --select @timediff= getdate () --记录时间 SET @beginRow = (@pageNo - 1) * @pageSize + 1 SET @endRow = @pageNo * @pageSize SET @tempLimit = 'rows BETWEEN ' + CAST(@beginRow AS VARCHAR) + ' AND ' +CAST(@endRow AS VARCHAR) --输出参数为总记录数 SET @tempCount = 'SELECT @recordTotal = COUNT(*) FROM (SELECT ' +@keyName+ ' FROM ' +@viewName+ ' WHERE ' +@whereString+ ') AS my_temp' EXECUTE sp_executesql @tempCount,N '@recordTotal INT OUTPUT' ,@recordTotal OUTPUT --主查询返回结果集 SET @tempMain = 'SELECT * FROM (SELECT ROW_NUMBER() OVER (order by ' +@orderString+ ') AS rows ,' +@fieldName+ ' FROM ' +@viewName+ ' WHERE ' +@whereString+ ') AS main_temp WHERE ' +@tempLimit -- PRINT @tempMain EXECUTE (@tempMain) --select datediff(ms,@timediff, getdate ()) as 耗时 set nocount off END </code> |
GO
注:关于mssql 高效的分页存储过程分享的内容就先介绍到这里,更多相关文章的可以留意
代码注释