分页存储过程

CREATE PROCEDURE [dbo].[DK_Get_Page_List]
@TableName NVARCHAR(MAX), --要显示的表或多个表的连接
@FieldName NVARCHAR(500), --要显示的字段列表
@FieldSort NVARCHAR(200), --排序字段列表或条件,必须输入
@Condition NVARCHAR(1000), --查询条件,不需WHERE,必须输入
@PageSize INT = 20, --每页显示的记录数
@Page INT = 1 , --要显示那一页的记录
@RtnCurpage INT = 1 OUTPUT, --返回显示那一页的记录
@RtnPageCount INT = 1 OUTPUT, --查询结果分页后的总页数
@RtnCount INT = 1 OUTPUT, --查询到的记录数
@RtnMsg NVARCHAR(100) OUTPUT --返回信息
AS
BEGIN
SET NOCOUNT ON;
SET @RtnMsg = ''

BEGIN TRY
DECLARE @Sql NVARCHAR(MAX)
--取得总记录数
SET @Sql = N'SELECT @Cnt = COUNT(1) FROM ' + @TableName + N' WHERE ' + @Condition
/*
* 输出PING SQL
* SELECT @Sql
*/
EXEC sp_executesql @Sql, N'@Cnt INT OUTPUT', @RtnCount OUTPUT

IF @RtnCount = 0
BEGIN
SET @RtnPageCount = 0
SET @RtnCurpage = 0
SET NOCOUNT OFF
RETURN
END

--取得分页总数
SET @RtnPageCount = (@RtnCount + @PageSize - 1)/@PageSize

--取得当前页值
SET @RtnCurpage = @Page
IF @Page > @RtnPageCount
BEGIN
SET @RtnCurpage = @RtnPageCount
END
IF @Page < 1
BEGIN
SET @RtnCurpage = 1
END

--取得分页记录结果
SET @Sql = N' SELECT * FROM ( SELECT ' + @FieldName + N', ROW_NUMBER() OVER(ORDER BY ' + @FieldSort
+ N') AS _ROW FROM ' + @TableName + N' WHERE ' + @Condition
+ N') _Table WHERE _Table._ROW BETWEEN ' + CAST(@PageSize * (@RtnCurpage - 1) + 1 AS NVARCHAR(12))
+ N' AND ' + CAST(@RtnCurpage * @PageSize AS NVARCHAR(12))
/*
* 输出PING SQL
* SELECT @Sql
*/
EXEC (@Sql)
END TRY
BEGIN CATCH
SET @RtnMsg = '系统错误'
END CATCH

SET NOCOUNT OFF
END

GO

原文地址:https://www.cnblogs.com/lxf1117/p/4707295.html