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

网络编程 2025-03-28 20:24www.168986.cn编程入门

近期我面对了一项挑战:处理数百万条数据的分页查询。我深入研究了许多策略,并在本机的实际数据库上进行了详尽的测试。这个过程可谓历经波折,今天我不打算赘述细节,直接进入正题。这也是大多数寻找答案的朋友们最期待的方式。

下面我要分享的是一个存储过程的代码,它能帮助你处理这类大规模数据的分页查询。

存储过程的代码如下:

```sql

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

GO

```

这个存储过程用于处理大规模数据的分页查询,通过构建动态SQL语句来执行查询,并返回结果集。它考虑了多种参数,如表名、查询字段、索引字段、每页记录数、当前页、排序条件和WHERE条件等。它还考虑了查询效率,通过关闭计数和提高执行效率来优化性能。希望这个存储过程能帮助你解决类似的问题。

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by