一个基于ROW_NUMBER()的通用分页存储过程代码

网络编程 2025-03-13 03:22www.168986.cn编程入门

接下来是存储过程的代码:

```sql

ALTER PROCEDURE [dbo].[COMMON_PROCEDURE_SelectWithPage]

@Sql VARCHAR(5000), -- 这里传入的是你的查询语句

@CurrentPageNo INT, -- 当前页码

@PageSize INT, -- 每页显示数量

@TotalNum INT OUTPUT -- 输出总记录数

AS

SET NOCOUNT ON

DECLARE @SqlCmd VARCHAR(5000)

-- 查询数据

SET @SqlCmd = 'SELECT FROM (' + @Sql + ') A WHERE RowIndex BETWEEN ' + CONVERT(VARCHAR, (@CurrentPageNo - 1) @PageSize + 1) + ' AND ' + CONVERT(VARCHAR, @CurrentPageNo @PageSize - 1)

EXEC(@SqlCmd)

PRINT (@SqlCmd)

-- 求记录总数

IF @TotalNum = -1 -- 如果需要获取总记录数,则执行下面的代码块

BEGIN

CREATE TABLE Temp1(num INT)

INSERT INTO Temp1 EXEC('SELECT count() FROM (' + @Sql + ') A')

SELECT @TotalNum = (SELECT TOP 1 num FROM Temp1) -- 获取临时表中的数值即为总记录数

DROP TABLE Temp1 -- 删除临时表

END

```

使用方式十分简便:首先定义一个包含ROW_NUMBER() OVER(...) AS RowIndex的SQL语句,然后传入相应的参数即可。例如:

```sql

DECLARE @Sql VARCHAR(5000)

DECLARE @CurrentPageNo INT

DECLARE @PageSize INT

DECLARE @TotalNum INT

SET @CurrentPageNo = 100

SET @PageSize = 10

SET @TotalNum = -1 -- 表示需要获取总记录数

SET @Sql = 'SELECT , ROW_NUMBER() OVER (ORDER BY 排序字段) AS RowIndex FROM 表名 A WITH (NOLOCK)'

EXEC [dbo].[COMMON_PROCEDURE_SelectWithPage] @Sql, @CurrentPageNo, @PageSize, @TotalNum OUTPUT

SELECT @TotalNum -- 输出总记录数

```

通过这种方式,你可以轻松实现分页查询功能,提高数据处理的效率。请注意,对于数据量较大或对性能要求较高的场景,建议根据实际情况进行个性化处理,以获得更好的性能表现。

上一篇:解决Angular2 router.navigate刷新页面的问题 下一篇:没有了

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