------创建数据库data_Test -----
create database data_Test
GO
use data_Test
GO
create 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 on
declare @count
int
set
@count=1
while
@count<=2000000
begin
insert
into tb_TestTable(id,userName,userPWD,userEmail) values(@count, 'admin' , 'admin888' , 'lli0077@yahoo.com.cn' )
set
@count=@count+1
end
set
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 --每页记录数
)
as
begin
set
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后不支技直接接参数,所以写成了字符串@sql
select
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 --页记录数
)
as
begin
set
nocount on ;
declare @timediff datetime
declare @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
)
as
declare @count
int
declare @ID
int
declare @timediff datetime
declare @sql nvarchar(500)
begin
set
nocount on ;
select
@count=0,@ID=0,@timediff=getdate()
select
@count=@count+1,@ID= case when @count<=@pageSize*@pageIndex then ID else @ID end from tb_testTable order by id
set
@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
)
as
declare @timediff datetime
begin
set
nocount on ;
select
@timediff=getdate()
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)
select
datediff(ms,@timediff,getdate()) as 耗时
set
nocount off;
end
---5、利用临时表及Row_number
create procedure proc_CTE --利用临时表及Row_number
(
@pageIndex
int , --页索引
@pageSize
int --页记录数
)
as
set
nocount on ;
declare @ctestr nvarchar(400)
declare @strSql nvarchar(400)
declare @datediff datetime
begin
select
@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
@strSql=@ctestr+ ' select * From Table_CTE where page_num=' +str(@pageIndex)
end
begin
execute sp_executesql @strSql
select
datediff(ms,@datediff,GetDate())
set
nocount off;
end
|
存储过程的5种分页写法,下面的代码是从忘了什么时候从别人那Ctrl+C来的,所以仅仅作为收藏,希望作者看到不要喷我.