T-SQL分页功能存储过程

Posted yuzhihui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了T-SQL分页功能存储过程相关的知识,希望对你有一定的参考价值。

分页功能存储过程

ALTER PROCEDURE [dbo].[P_SplitPagesQuery]
@TablesName NVARCHAR(MAX),--表名或视图名(只能传单一表名)
@PK NVARCHAR(MAX)=‘‘,--主键(可以为空!)
@StrSort NVARCHAR(MAX)=‘‘,--排序字段(按照这个字段对查询结果进行排序),不能为空
@SortType INT =0,--排序方式,默认为0(升序),1为降序
@StrWhere NVARCHAR(MAX)=‘‘,--查询条件(即sql语句中的where后面部分)
@Fields NVARCHAR(MAX)=*,--读取字段(呈现出来的字段)
@PageCurrent INT =1,--当前页码,默认为1
@PageSize INT =10,--页面大小,默认为10
@PageCount INT OUTPUT,--总页数(按照页面大小一共分了多少页)
@RecordCount INT OUTPUT--查询结果的总条数
AS
/*
    返回值说明:查询结果(表)
*/
DECLARE @SqlStr nvarchar(4000)

IF @StrWhere IS NOT NULL AND @StrWhere != ‘‘
   BEGIN
     SET @StrWhere =  WHERE  + @StrWhere +  
   END
ELSE
   BEGIN
      SET @StrWhere = ‘‘
   END
BEGIN
   IF @StrSort = ‘‘
      IF @PK  IS NOT NULL AND @PK!=‘‘
                SET @StrSort = @PK
   IF @PageCurrent < 1
      SET @PageCurrent = 1
     IF @SortType = 1 AND @StrSort!=‘‘
            SET @StrSort = @StrSort +  DESC 
   IF @SortType = 0 AND @StrSort!=‘‘
            SET @StrSort = @StrSort +  ASC 

   IF @PageCurrent = 1 --第一页提高性能
       BEGIN
           SET @SqlStr = SELECT TOP  + str(@PageSize) + +@Fields+  FROM  + @TablesName + 
               AS tb  + @StrWhere
                     IF @StrSort!=‘‘
                            SET @SqlStr = @SqlStr +  ORDER BY + @StrSort
       END
   ELSE
      BEGIN
         DECLARE @StartPos NVARCHAR(50)
         DECLARE @EndPos NVARCHAR(50)
         SET @StartPos = CONVERT(NVARCHAR(50),(@PageCurrent - 1) * @PageSize + 1)
         SET @EndPos = CONVERT(NVARCHAR(50),@PageCurrent * @PageSize)
         SET @SqlStr =   SELECT +@Fields+ 
         FROM (SELECT ROW_NUMBER() OVER(ORDER BY +@StrSort+) AS RowNum , tb.* +
         FROM +@TablesName+ AS tb +@StrWhere+) AS D
         WHERE RowNum BETWEEN +@StartPos+ AND  +@EndPos
                 IF @StrSort!=‘‘
                            SET @SqlStr = @SqlStr +  ORDER BY + @StrSort
      END
END

print @SqlStr
EXEC(@SqlStr)

DECLARE @SqlCount NVARCHAR(4000)

SET @SqlCount = SELECT @RecordCount=COUNT(*),@PageCount=CEILING((COUNT(*)+0.0)/
                    + CAST(@PageSize AS VARCHAR)+) FROM  + @TablesName + @StrWhere
--输出参数赋值
EXEC SP_EXECUTESQL @SqlCount,N@RecordCount INT OUTPUT,@PageCount INT OUTPUT,
                               @RecordCount OUTPUT,@PageCount OUTPUT

调用示例

EXEC @x =[dbo].[P_SplitPagesQuery] 表或视图,‘‘,@sOrderBy,@nOrderTpye,@sSqlString,*,
        @nPageNum,@nPageSize,@PageCount OUTPUT,@RecordCount OUTPUT

......

以上是关于T-SQL分页功能存储过程的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL编程—分页功能(存储过程)

关于SQL分页存储过程的分析

使用存储过程进行分页

原创10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程)

老码农怀旧一个简单好用的分页存储过程

数据库sqlserver如何用存储过程做分页