通用分頁存儲過程(SQL Server 2005)


這是不久前寫的一個分頁存儲過程,可應用於SQL Server 2005上面:

 

if object_ID('[proc_SelectForPager]') is not null
    Drop Procedure [proc_SelectForPager]
Go
Create Proc proc_SelectForPager
(
  @Sql varchar(max) ,
  @Order varchar(4000) ,
  @CurrentPage int ,
  @PageSize int,
  @TotalCount int output
)
As
/*Andy 2012-2-28 */
Declare @Exec_sql nvarchar(max)
                
Set @Exec_sql='Set @TotalCount=(Select Count(1) From ('+@Sql+') As a)'
Exec sp_executesql @Exec_sql,N'@TotalCount int output',@TotalCount output
 
Set @Order=isnull(' Order by '+nullif(@Order,''),' Order By getdate()')
 
if @CurrentPage=1 /*經常會調用第1頁,這里做特殊處理,少一層子查詢*/
    Set @Exec_sql='
    ;With CTE_Exec As
    (
        '+@Sql+'
    )
    Select Top(@pagesize) *,row_number() Over('+@Order+') As r From CTE_Exec Order By r
    ' 
Else
    Set @Exec_sql='
    ;With CTE_Exec As
    (
        Select *,row_number() Over('+@Order+') As r From ('+@Sql+') As a 
    )
    Select * From CTE_Exec Where r Between (@CurrentPage-1)*@pagesize+1 And @CurrentPage*@pagesize Order By r
    '
 
 
Exec sp_executesql @Exec_sql,N'@CurrentPage int,@PageSize int',@CurrentPage,@PageSize
 
Go

 

調用方法:

1.單表:

Exec proc_SelectForPager @Sql = 'Select * from contacts a where a.ContactType=1', -- varchar(max)
        @Order = '', -- varchar(4000)
        @CurrentPage = 3, -- int
        @PageSize = 20, -- int
        @TotalCount = 0 -- int

2.多表聯接:

Exec proc_SelectForPager @Sql = 
    'Select a.Staff,a.OU,b.FName+b.FName as Name 
            from staffOUHIST a 
                inner join Staff b on b.ID=a.Staff and a.ExpiryDate=''30001231''
        ', -- varchar(max)
        @Order = '', -- varchar(4000)
        @CurrentPage = 3, -- int
        @PageSize = 20, -- int
        @TotalCount = 0 -- int

 

注:在@Sql 中不能使用CTE。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM