拋磚引玉——通用分頁儲存過程

iSQlServer發表於2009-12-10

以前用的sqlserver2000,寫了一個通用分頁儲存過程,傳進去一個sql語句、頁碼、頁大小就能進行分頁,最近公司升級sqlserver2005,就把以前的改了改,從執行計劃和統計的各項計數來看效能比以前好了。

正好今天有人探討這個話題,我就也貼上來分享一下,歡迎批評指正,要是能提些改進建議那最好不過了。

 

<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --&gtCREATE PROCEDURE [dbo].[PageView]
    
@select VARCHAR(max),
    
@CurrentPage INT,
    
@PageSize INT
AS
BEGIN
    
declare @sql NVARCHAR(max)
    
DECLARE @RecordCurrent INT
    
DECLARE @PageCount INT
    
DECLARE @RecordCount INT
    
SET NOCOUNT ON
    
set @sql='select @RecordCount=count(*) from ('+@select+') a'
    
exec sp_executesql @sql,N'@RecordCount int output',@RecordCount output
    
SET @PageCount=(@RecordCount+@PageSize-1)/@PageSize
    
IF ISNULL(@CurrentPage,0)<1
        
SET @CurrentPage=1
    
ELSE if ISNULL(@CurrentPage,0)>@PageCount
        
SET @CurrentPage=@PageCount
    
SELECT @CurrentPage AS CurrentPage,@RecordCount AS RecordCount,@PageSize AS PageSize,@PageCount AS PageCount
    
set @sql='select * from ('+@select+') a where rownumber between '+cast((@CurrentPage-1)*@PageSize+1 as varchar)+' and '+cast(@CurrentPage*@PageSize as varchar)
    
exec (@sql)
END

 

 

呼叫

 

<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --&gtexec PageView 'select userid,username,row_number() over(order by userid desc) as rownumber from Users',2,10

 缺點很顯然'select userid,username,row_number() over(order by userid desc) as rownumber from Users',這裡要提供rownumber 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/16436858/viewspace-622140/,如需轉載,請註明出處,否則將追究法律責任。

相關文章