分页存储过程

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO

/* Function: SuperPaging
* Description:
* 超强通用分页存储过程
* Example:
* SuperPaging @TableName='表名',@Orderfld='排序列名'
*/
create PROCEDURE [dbo].[SupesoftPage]
(
@TableName nvarchar(50),            -- 表名
@ReturnFields nvarchar(2000) = '*', -- 需要返回的列
@PageSize int = 10,                    -- 每页记录数
@PageIndex int = 1,                    -- 当前页码
@Where nvarchar(2000) = '',            -- 查询条件
@Orderfld nvarchar(2000),            -- 排序字段名 最好为唯一主键
@OrderType int = 1,                    -- 排序类型 1:降序 其它为升序@
@RetVal int output

)
AS
DECLARE @TotalRecord                int                    --总记录数
DECLARE @TotalPage                    int                    --总页数
DECLARE @CurrentPageSize            int                    --当前页码
DECLARE @TotalRecordForPageIndex    int                    --当前总记录数分配页码
DECLARE @OrderBy                    nvarchar(255)        --order by 条件
DECLARE @CutOrderBy                    nvarchar(255)        --order by 条件
DECLARE @fromRowNo                    int                    --开始记录数

--如果排序类型为降序
if @OrderType = 1
BEGIN
set @OrderBy = ' Order by ' + REPLACE(@Orderfld,',',' desc,') + ' desc '
set @CutOrderBy = ' Order by '+ REPLACE(@Orderfld,',',' asc,') + ' asc '
END
else    --排序类型为升序
BEGIN
set @OrderBy = ' Order by ' + REPLACE(@Orderfld,',',' asc,') + ' asc '
set @CutOrderBy = ' Order by '+ REPLACE(@Orderfld,',',' desc,') + ' desc '
END


-- 记录总数
declare @countSql nvarchar(4000)
set @countSql='SELECT @TotalRecord=Count(1) From '+@TableName+' '+@Where
--执行存储过程获取记录总数
execute sp_executesql @countSql,N'@TotalRecord int out',@TotalRecord out

--设置总记录数
set @RetVal = @TotalRecord
if @RetVal<>0
begin
    --设置总页数
    --SET @TotalPage=(@TotalRecord-1)/@RetVal+1
    SET @TotalPage=@RetVal/@PageSize+1;
end
    --如果总记录数为零设置当”前页大小“为”分页大小“
    SET @CurrentPageSize=@PageSize
   
--如果总页数等于当前页码

/*这段都给注释了感觉不知道要干嘛   
IF(@TotalPage=@PageIndex)
BEGIN
    SET @CurrentPageSize=@TotalRecord%@PageSize
IF(@CurrentPageSize=0)
    SET @CurrentPageSize=@PageSize
END
*/

--end of rowno
set @TotalRecordForPageIndex=@PageIndex*@PageSize
--from of rowno
set @fromRowNo=(@PageIndex-1)*@PageSize



/*这段也给注释了
if(@PageIndex=1)
Begin
   exec('select top '+@PageSize+' '+@ReturnFields+' FROM '+@TableName+' '+@Where+' '+@OrderBy)
End
Else
begin
--exec('SELECT * FROM
--(SELECT TOP '+@PageSize+' * FROM
--(SELECT TOP '+@TotalRecordForPageIndex+' '+@ReturnFields+'
--FROM '+@TableName+' '+@Where+' '+@OrderBy+') TB2
--'+@CutOrderBy+') TB3
--'+@OrderBy)
*/

exec('select * from (select '+@ReturnFields+',ROW_NUMBER() OVER ('+@OrderBy+') AS RowNo from '+@TableName+' '+@Where+') as t where t.RowNo>'+@fromRowNo+' and t.RowNo<='+@TotalRecordForPageIndex)
print N'select * from (select '+@ReturnFields+',ROW_NUMBER() OVER ('+@OrderBy+') AS RowNo from '+@TableName+' '+@Where+') as t where t.RowNo>'+cast(@fromRowNo as varchar(50))+' and t.RowNo<='+cast(@TotalRecordForPageIndex as varchar(50))
/*end*/
 
-- 返回总页数和总记录数
 SELECT * FROM (SELECT @TotalPage as PageCount,@TotalRecord as RecordCount) B

发布了45 篇原创文章 · 获赞 3 · 访问量 9万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章