標籤:var temp create 直接 when har 過程 收藏 span
------建立資料庫data_Test -----create database data_TestGOuse data_TestGOcreate table tb_TestTable --建立表(id int identity(1,1) primary key,userName nvarchar(20) not null,userPWD nvarchar(20) not null,userEmail nvarchar(40) null)GO------插入資料------set identity_insert tb_TestTable ondeclare @count intset @count=1while @count<=2000000begininsert into tb_TestTable(id,userName,userPWD,userEmail) values(@count,‘admin‘,‘admin888‘,‘[email protected]‘)set @[email protected]+1endset identity_insert tb_TestTable off---1、利用select top 和select not in進行分頁,具體代碼如下create procedure proc_paged_with_notin --利用select top and select not in(@pageIndex int, --頁索引@pageSize int --每頁記錄數)asbeginset nocount on;declare @timediff datetime --耗時declare @sql nvarchar(500)select @timediff=Getdate()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‘execute(@sql) --因select top後不支技直接接參數,所以寫成了字串@sqlselect datediff(ms,@timediff,GetDate()) as 耗時set nocount off;end---2、利用select top 和 select max(列鍵)---create procedure proc_paged_with_selectMax --利用select top and select max(列)(@pageIndex int, --頁索引@pageSize int --頁記錄數)asbeginset nocount on;declare @timediff datetimedeclare @sql nvarchar(500)select @timediff=Getdate()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‘execute(@sql)select datediff(ms,@timediff,GetDate()) as 耗時set nocount off;end---3、利用select top和中間變數--此方法因網上有人說效果最佳---create procedure proc_paged_with_Midvar --利用ID>最大ID值和中間變數(@pageIndex int,@pageSize int)asdeclare @count intdeclare @ID intdeclare @timediff datetimedeclare @sql nvarchar(500)beginset nocount on;select @count=0,@ID=0,@timediff=getdate()select @[email protected]+1,@ID=case when @count<[email protected]*@pageIndex then ID else @ID end from tb_testTable order by idset @sql=‘select top ‘+str(@pageSize)+‘ * from tb_testTable where ID>‘+str(@ID)execute(@sql)select datediff(ms,@timediff,getdate()) as 耗時set nocount off;end---4、利用Row_number() 此方法為SQL server 2005中新的方法,利用Row_number()給資料行加上索引create procedure proc_paged_with_Rownumber --利用SQL 2005中的Row_number()(@pageIndex int,@pageSize int)asdeclare @timediff datetimebeginset nocount on;select @timediff=getdate()select * from (select *,Row_number() over(order by ID asc) as IDRank from tb_testTable) as IDWithRowNumber whereIDRank>@pageSize*@pageIndex and IDRank<@pageSize*(@pageIndex+1)select datediff(ms,@timediff,getdate()) as 耗時set nocount off;end---5、利用暫存資料表及Row_numbercreate procedure proc_CTE --利用暫存資料表及Row_number(@pageIndex int, --頁索引@pageSize int --頁記錄數)asset nocount on;declare @ctestr nvarchar(400)declare @strSql nvarchar(400)declare @datediff datetimebeginselect @datediff=GetDate()set @ctestr=‘with Table_CTE as(select ceiling((Row_number() over(order by ID ASC))/‘+str(@pageSize)+‘) as page_num,* from tb_TestTable)‘;set @[email protected]+‘ select * From Table_CTE where page_num=‘+str(@pageIndex)endbeginexecute sp_executesql @strSqlselect datediff(ms,@datediff,GetDate())set nocount off;end |
預存程序的5種分頁寫法,下面的代碼是從忘了什麼時候從別人那Ctrl+C來的,所以僅僅作為收藏,希望作者看到不要噴我.
SQL Server分頁的預存程序寫法以及效能比較