分頁存儲過程

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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章