/***************************************************** 存储过程名称:pagination 功能:通用分页 返回值:无 参数: 1.表名(字符串,必要参数) 2.主键或者唯一约束字段(字符串,必要参数) 3.需不需要进行总数统计.(布尔类型,可选参数,默认为1。 1或者true是只统计总条数,不进行查询, 0或者false进行分页查询,不进行统计) 4.查询条件(字符串,可选参数,默认为无条件查询。 注意不要加where) 5.排序的字段名(字符串,可选参数,默认按照主键排序) 6.页码(整数,可选参数,默认第1页) 7.每页大小(整数,可选参数,默认每页10条记录) 8.排序类型(整数或布尔,可选参数,默认升序排序 1或true按降序排序 0或false按升序排列) 9.需要返回的列(字符串,可选参数,默认返回所有列) *****************************************************/ CREATE PROCEDURE pagination @TableName varchar(255), -- 表名 @PrimaryKey varchar(255),--主键或者唯一约束字段 @DoCount bit = 0, -- 需不需要进行总数统计.1是只统计总条数,不进行查询 0进行分页查询,不进行统计 @StrWhere varchar(1500) = '', -- 查询条件 (注意: 不要加 where)@OrderField varchar(255)=@PrimaryKey, -- 排序的字段名,默认按照主键排序 @PageIndex int = 1, -- 页码 @PageSize int = 10, -- 页尺寸 @OrderType bit = 0 ,-- 设置排序类型, 非 0 值则降序 @StrGetFields varchar(1000) = '*'-- 需要返回的列 ASdeclare @strSQL varchar(5000) -- 主语句 declare @strTmp varchar(110) -- 临时变量 declare @strOrder varchar(400) -- 排序类型/******************************************** @DoCount传递过来的不是0,就执行总数统计 ********************************************/ if @DoCount != 0 begin if @StrWhere!='' set @strSQL = 'select count(*) as Total from ' + @TableName + ' where '+@strWhere else set @strSQL = 'select count(*) as Total from ' + @TableName end /******************************************** 以下的所有代码都是@DoCount为0的情况: ********************************************/ else begin /******************************************** 确定是升序还是降序 ********************************************/ if @OrderType != 0 begin set @strTmp = '<(select min' set @strOrder = 'order by ' + @OrderField +' desc' end else begin set @strTmp = '>(select max' set @strOrder = 'order by ' + @OrderField +' asc' end /********************************************** 为了加快执行速度,判断一下是不是第一页 ***********************************************/ if @PageIndex = 1 begin if @strWhere != '' set @strSQL ='select top ' + str(@PageSize) +' '+@StrGetFields+ ' from ' + @TableName + ' where ' + @strWhere + ' ' + @strOrder else set @strSQL ='select top ' + str(@PageSize) +' '+@strGetFields+ ' from '+ @TableName + ' '+ @strOrder end /********************************************** 不是第一页 ***********************************************/ else begin if @strWhere='' set @strSQL='select top '+str(@PageSize)+' '+@strGetFields+' from '+ @TableName +' where '+@PrimaryKey+@strTmp+'('+@PrimaryKey+') as '+@PrimaryKey+' from (select top '+str((@PageIndex-1)*@PageSize)+' '+@PrimaryKey+' from '+@TableName+' '+@strOrder+') as T) '+@strOrder else set @strSQL='select top '+str(@PageSize)+' '+@strGetFields+' from '+ @TableName +' where '+@PrimaryKey+@strTmp+'('+@PrimaryKey+') as '+@PrimaryKey+' from (select top '+str((@PageIndex-1)*@PageSize)+' '+@PrimaryKey+' from '+@TableName+' where '+@StrWhere+' '+@strOrder+') as T) and '+@StrWhere+' '+@strOrder
endprint @strSQL end execute(@strSQL)
set @strSQL='select top '+str(@PageSize)+' '+@strGetFields+' from '+ @TableName +' where '+@PrimaryKey+@strTmp+'('+@PrimaryKey+') as '+@PrimaryKey+' from (select top '+str((@PageIndex-1)*@PageSize)+' '+@PrimaryKey+' from '+@TableName+' '+@strOrder+') as T) '+@strOrder这句好像是关键的,能不能讲一下什么个意思
如果查询需求不大图省事可以直接用DATASET。
比较频繁建议使用存储过程
第一:使用存储过程进行分页,但是存储过程中不能出现“NOT IN”字样,虽然这里可以使用“not exists” 来代替“NOT IN”但是二者的执行效率实际上是没有什么区别的。影响我们查询速度的关键因素有两点:TOP和NOT IN。TOP可以提高我们的查询速度,而NOT IN会减慢我们的查询速度,所以要提高我们整个分页算法的速度,就要彻底改造NOT IN,同其他方法来替代它。比如通过max(字段)或min(字段)来提取某个字段中的最大或最小值,所以如果这个字段不重复,那么就可以利用这些不重复的字段的max或min作为分页算法中分开每页的参照物。
第二:如果是以只进只读方式返回数据那么你可以使用DataReader,虽然 DataAdapter 使用 DataReader 来填充 DataSet 的内容,但可以使用 DataReader 来提高性能,因为您将节省DataSet 所使用的内存,并将省去创建 DataSet 并填充其内容所需的必要处理。
怎么样得用存储过程分页呢
存储过程名称:pagination
功能:通用分页
返回值:无
参数:
1.表名(字符串,必要参数)
2.主键或者唯一约束字段(字符串,必要参数)
3.需不需要进行总数统计.(布尔类型,可选参数,默认为1。
1或者true是只统计总条数,不进行查询,
0或者false进行分页查询,不进行统计)
4.查询条件(字符串,可选参数,默认为无条件查询。
注意不要加where)
5.排序的字段名(字符串,可选参数,默认按照主键排序)
6.页码(整数,可选参数,默认第1页)
7.每页大小(整数,可选参数,默认每页10条记录)
8.排序类型(整数或布尔,可选参数,默认升序排序
1或true按降序排序
0或false按升序排列)
9.需要返回的列(字符串,可选参数,默认返回所有列)
*****************************************************/
CREATE PROCEDURE pagination
@TableName varchar(255), -- 表名
@PrimaryKey varchar(255),--主键或者唯一约束字段
@DoCount bit = 0, -- 需不需要进行总数统计.1是只统计总条数,不进行查询 0进行分页查询,不进行统计
@StrWhere varchar(1500) = '', -- 查询条件 (注意: 不要加 where)@OrderField varchar(255)=@PrimaryKey, -- 排序的字段名,默认按照主键排序
@PageIndex int = 1, -- 页码
@PageSize int = 10, -- 页尺寸
@OrderType bit = 0 ,-- 设置排序类型, 非 0 值则降序
@StrGetFields varchar(1000) = '*'-- 需要返回的列
ASdeclare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型/********************************************
@DoCount传递过来的不是0,就执行总数统计
********************************************/
if @DoCount != 0
begin
if @StrWhere!=''
set @strSQL = 'select count(*) as Total from ' + @TableName + ' where '+@strWhere
else
set @strSQL = 'select count(*) as Total from ' + @TableName
end
/********************************************
以下的所有代码都是@DoCount为0的情况:
********************************************/
else
begin
/********************************************
确定是升序还是降序
********************************************/
if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = 'order by ' + @OrderField +' desc'
end else
begin
set @strTmp = '>(select max'
set @strOrder = 'order by ' + @OrderField +' asc'
end /**********************************************
为了加快执行速度,判断一下是不是第一页
***********************************************/
if @PageIndex = 1
begin
if @strWhere != ''
set @strSQL ='select top ' + str(@PageSize) +' '+@StrGetFields+ ' from ' + @TableName + ' where ' + @strWhere + ' ' + @strOrder
else
set @strSQL ='select top ' + str(@PageSize) +' '+@strGetFields+ ' from '+ @TableName + ' '+ @strOrder
end
/**********************************************
不是第一页
***********************************************/
else
begin
if @strWhere=''
set @strSQL='select top '+str(@PageSize)+' '+@strGetFields+' from '+ @TableName +' where '+@PrimaryKey+@strTmp+'('+@PrimaryKey+') as '+@PrimaryKey+' from (select top '+str((@PageIndex-1)*@PageSize)+' '+@PrimaryKey+' from '+@TableName+' '+@strOrder+') as T) '+@strOrder
else
set @strSQL='select top '+str(@PageSize)+' '+@strGetFields+' from '+ @TableName +' where '+@PrimaryKey+@strTmp+'('+@PrimaryKey+') as '+@PrimaryKey+' from (select top '+str((@PageIndex-1)*@PageSize)+' '+@PrimaryKey+' from '+@TableName+' where '+@StrWhere+' '+@strOrder+') as T) and '+@StrWhere+' '+@strOrder
endprint @strSQL
end
execute(@strSQL)