在 分页是内部集成的功能,针对不同的数据库,使用不同的分页形式。
1:Access :集成:使用3次Top分页2:MySql :集成,使用Limit N分页3:Sqlite :集成,使用Limit N分页4:Sql2000:外置存储过程,使用临时表方式分页5:Sql2005:外置存储过程,使用ROW_NUMBER方式分页6:Oracle :外置存储过程,使用RowNum 方式分页
下面是三种不同存储过程代码:
1:数据框架在 的 的代码:
create procedure SelectBase
@PageIndex int, @PageSize int, @TableName nvarchar(4000), @Where nvarchar(2000)='' as Declare @rowcount int Declare @intStart int Declare @intEnd int declare @Column1 varchar(32) --第一列名称 Declare @Sql nvarchar(2000), @WhereR nvarchar(1000), @OrderBy nvarchar(1000) set @rowcount=0 set nocount on if @Where<>'' begin set @Where=' and end if CHARINDEX('order by', @Where)>0 begin set @WhereR=substring(@Where, 1, CHARINDEX('order by',@Where)-1) --取得条件 set @OrderBy=substring(@Where, CHARINDEX('order by',@Where), Len(@Where)) --取得排序方式(order by 字段 方式) end else begin set @WhereR=@Where set @OrderBy=' order by id asc' end set @Sql='SELECT @rowcount=count(*) from '+cast(@TableName as varchar(4000))+' where 1=1exec sp_executeSql @Sql,N'@rowcount int output',@rowcount output
if @PageIndex=0 and @PageSize=0 --不进行分页,查询所有数据列表 begin set @Sql='SELECT * from '+cast(@TableName as varchar(4000))+' where 1=1 end else --进行分页查询数据列表 begin set @intStart=(@PageIndex-1)*@PageSize+1; set @intEnd=@intStart+@PageSize-1 set @Column1=col_name(object_id(@tableName),1) --设置第一列名称 if @Column1 is null begin set @Column1='ID' end --设置默认为ID列 set @Sql='Create table #tem(tempID int identity(1,1) not null,Row int) ' set @Sql=@Sql+'insert #tem(Row) select from where 1=1 set @Sql=@Sql+' select * from left join #tem on ' set @Sql=@Sql+' where #tem.tempID between '+cast(@intStart as varchar)+' and '+cast(@intEnd as varchar) end exec sp_executeSql @Sql return @rowcount set nocount off GO
Tip:
最近有使用 的网友在分页上出了点问题,经过重重排查,竟然是由于分页里的注释代码引起的。
所以,使用此分页存储过程的网友注意一下,如果有问题,请把注释删除。
2:数据框架在 的 的代码:
Create procedure [SelectBase] @PageIndex int, @PageSize int, @TableName nvarchar(4000), @Where nvarchar(max)='' as Declare @rowcount int Declare @intStart int Declare @intEnd int Declare @SQl nvarchar(max), @WhereR nvarchar(max), @OrderBy nvarchar(max) set @rowcount=0 set nocount on if @Where<>'' begin set @Where=' and end if CHARINDEX('order by', @Where)>0 begin set @WhereR=substring(@Where, 1, CHARINDEX('order by',@Where)-1) --取得条件 set @OrderBy=substring(@Where, CHARINDEX('order by',@Where), Len(@Where)) --取得排序方式(order by 字段 方式) end else begin set @WhereR=@Where set @OrderBy=' order by id asc' end set @SQl='SELECT @rowcount=count(*) from '+cast(@TableName as varchar(4000))+' where 1=1 exec sp_executeSql @SQl,N'@rowcount int output',@rowcount output if @PageIndex=0 and @PageSize=0 --不进行分页,查询所有数据列表 begin set @SQl='SELECT * from '+cast(@TableName as varchar(4000))+' where 1=1 end else --进行分页查询数据列表 begin set @intStart=(@PageIndex-1)*@PageSize+1; set @intEnd=@intStart+@PageSize-1 set @SQl='select * from(select *,ROW_NUMBER() OVER('+cast(@OrderBy as nvarchar(400))+') as row from ' set @SQl=@SQL+@TableName+' where 1=1 ) as a where row between '+cast(@intStart as varchar)+' and '+cast(@intEnd as varchar) end exec sp_executeSql @SQl return @rowcount set nocount off
3:Oracle 的分页存储过程代码
这里就不贴了,见帖子: