在MSSQL中关于使用T-SQL查询作为参数的分页存储过程

  关于分页的存储过程网上有很多,找了很久也是没有找到一个直接使用T-SQL语句做为参数的存储过程,苦想了很久,直接上代码

/*
    基于T-SQL查询语句为参数的分页存储过程
输入参数:
    @sqlstr:查询的完整sql语句
    @PrimaryKey:唯一的主键名 例:ID
    @where:参数赋值直接给值 例:and ID=1
    @orderby:参数赋值直接给值 例:ID desc 
    @pageSize:页数据大小 例:20
    @pageIndex:页索引 例:1
输出参数:
    @DataCount:总数据行
    @PageCount:总页数
    @ThisIndex:当前页索引
     注:@sqlstr以创建视图的sql语句为标准(列名不重复)
    -------------------------------------------------------------
*/
create proc P_DataPaging
(
@sqlStr nvarchar(max),--查询T-SQL语句
@PrimaryKey nvarchar(1000),--主键
@Where nvarchar(1000),--查询条件
@OrderBy nvarchar(1000),--排序条件 
@pageSize int, --页大小
@pageIndex int, --页索引
@DataCount int out,--总数据行
@PageCount int out, --总页数
@ThisIndex int out--当前页码
)
as
declare @temp nvarchar(max) --临时查询sql
declare @DataCountsql nvarchar(max)--查询总数据行sql
    if(RTRIM(LTRIM(@OrderBy))<>‘‘)
        set @OrderBy= order by +@OrderBy;
    --获取总数据行的sql
    set @DataCountsql=select @count=COUNT(tb.+@PrimaryKey+) from (+@sqlStr+) tb where 0=0 +@Where;
    
    --获取数据行
    exec sp_executesql @DataCountsql,N@count int output,@count=@DataCount output;
    set @PageCount=@DataCount/@pageSize;
    if(@DataCount-@pageIndex*@pageSize>0)
        set @PageCount=@PageCount+1;
    set @ThisIndex=@pageIndex;
    --如果传入的index大于总页数,返回最后一页的数据
    if(@pageIndex>@PageCount)
        set @pageIndex=@PageCount;
    --分页查询sql
 set @temp=select * from (select ROW_NUMBER() over(order by (select 0))as RowNumber,+SUBSTRING(@sqlStr,(LEN(select )+1),LEN(@sqlStr))+) as tb where tb.RowNumber between + CONVERT(nvarchar(1000),@pageSize*(@pageIndex-1)+1) + and +CONVERT(nvarchar(1000),@pageSize*@pageIndex)+ +@Where+@OrderBy;
 
    --返回数据
    exec(@temp)
    return @DataCount
    return @PageCount
    return @ThisIndex
 --------------------------------------end---------------------------------

使用ROW_NUMBER()进行分页,
ROW_NUMBER() 需要某个列来进行排序,在这里我又不需要进行排序操作,那么就用ROW_NUMBER() over(order by (select 0))就可以了
将原始的@sqlStr截取将第一个select替换新加入的row_number()函数生成的行列,在将替换后的sql语句作为内嵌视图,对rownumber进行筛选完成分页,整个分页存储过程就完成了。

---------------------------------------------------------------------END------------------------------------------------------------------------------
PS:如有不对或者错误欢迎指正!

在MSSQL中关于使用T-SQL查询作为参数的分页存储过程,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。