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