1. 程式人生 > >分頁-儲存過程5種寫法 sqlserver分頁

分頁-儲存過程5種寫法 sqlserver分頁

SQL Server資料庫操作中,我們常常會用到儲存過程對實現對查詢的資料的分頁處理,以方便瀏覽者的瀏覽。本文我們總結了五種SQL Server分頁儲存過程的方法,並對其效能進行了比較,接下來就讓我們來一起了解一下這一過程。

建立資料庫data_Test :

  1. create database data_Test    
  2. GO    
  3. use data_Test    
  4. GO    
  5. create table tb_TestTable   --建立表    
  6. (    
  7. id int identity(1,1) primary key,    
  8. userName nvarchar(20) not null,    
  9. userPWD nvarchar(20) not null,    
  10. userEmail nvarchar(40) null   
  11. )    
  12. GO 

插入資料:

  1. set identity_insert tb_TestTable on    
  2. declare @count int   
  3. [email protected]count=1
  4. while @count<=2000000    
  5. begin    
  6. insert into tb_TestTable(id,userName,userPWD,userEmail) values(@count,'admin','admin888','[email protected]
    ')    
  7. set @count[email protected]+1    
  8. end    
  9. set identity_insert tb_TestTable off 

1、利用select top 和select not in進行分頁

具體程式碼如下:

  1. create procedure proc_paged_with_notin  --利用select top and select not in   
  2. (    
  3. @pageIndex int,  --頁索引    
  4. @pageSize int    --每頁記錄數    
  5. )    
  6. as   
  7. begin    
  8. set nocount on;    
  9. declare @timediff datetime --耗時    
  10. declare @sql nvarchar(500)    
  11. select @timediff=Getdate()    
  12. set @sql='select top '+str(@pageSize)+' * from tb_TestTable where(ID not in(select top '+str(@pageSize*@pageIndex)+' id from tb_TestTable order by ID ASC)) order by ID'   
  13. execute(@sql)  --因select top後不支技直接接引數,所以寫成了字串@sql    
  14. select datediff(ms,@timediff,GetDate()) as 耗時    
  15. set nocount off;    
  16. end 

2、利用select top 和 select max(列鍵)

  1. create procedure proc_paged_with_selectMax  --利用select top and select max(列)    
  2. (    
  3. @pageIndex int,  --頁索引    
  4. @pageSize int    --頁記錄數    
  5. )    
  6. as   
  7. begin    
  8. set nocount on;    
  9. declare @timediff datetime    
  10. declare @sql nvarchar(500)    
  11. select @timediff=Getdate()    
  12. set @sql='select top '+str(@pageSize)+' * From tb_TestTable where(ID>(select max(id) From (select top '+str(@pageSize*@pageIndex)+' id From tb_TestTable order by ID) as TempTable)) order by ID'   
  13. execute(@sql)    
  14. select datediff(ms,@timediff,GetDate()) as 耗時    
  15. set nocount off;    
  16. end 

3、利用select top和中間變數

  1. create procedure proc_paged_with_Midvar  --利用ID>最大ID值和中間變數    
  2. (    
  3. @pageIndex int,    
  4. @pageSize int   
  5. )    
  6. as   
  7. declare @count int   
  8. declare @ID int   
  9. declare @timediff datetime    
  10. declare @sql nvarchar(500)    
  11. begin    
  12. set nocount on;    
  13. select @count=0,@ID=0,@timediff=getdate()    
  14. select @count[email protected]+1,@ID=case when @count<[email protected]*@pageIndex then ID else @ID end from tb_testTable order by id    
  15. set @sql='select top '+str(@pageSize)+' * from tb_testTable where ID>'+str(@ID)    
  16. execute(@sql)    
  17. select datediff(ms,@timediff,getdate()) as 耗時    
  18. set nocount off;    
  19. end 

4、利用Row_number() 此方法為SQL server 2005中新的方法,利用Row_number()給資料行加上索引

  1. create procedure proc_paged_with_Rownumber  --利用SQL 2005中的Row_number()    
  2. (    
  3. @pageIndex int,    
  4. @pageSize int   
  5. )    
  6. as   
  7. declare @timediff datetime    
  8. begin    
  9. set nocount on;    
  10. select @timediff=getdate()    
  11. select * from (select *,Row_number() over(order by ID asc) as IDRank from tb_testTable) as IDWithRowNumber where IDRank>@pageSize*@pageIndex and IDRank<@pageSize*(@pageIndex+1)    
  12. select datediff(ms,@timediff,getdate()) as 耗時    
  13. set nocount off;    
  14. end  

5、利用臨時表及Row_number

  1. create procedure proc_CTE  --利用臨時表及Row_number    
  2. (    
  3. @pageIndex int,  --頁索引    
  4. @pageSize int    --頁記錄數    
  5. )    
  6. as   
  7. set nocount on;    
  8. declare @ctestr nvarchar(400)    
  9. declare @strSql nvarchar(400)    
  10. declare @datediff datetime    
  11. begin    
  12. select @datediff=GetDate()    
  13. set @ctestr='with Table_CTE as   
  14. (select ceiling((Row_number() over(order by ID ASC))/'+str(@pageSize)+') as page_num,* from tb_TestTable)';    
  15. set @strSql[email protected]+' select * From Table_CTE where page_num='+str(@pageIndex)    
  16. end    
  17. begin    
  18. execute sp_executesql @strSql    
  19. select datediff(ms,@datediff,GetDate())    
  20. set nocount off;    
  21. end