前两天在做网站时需要手动分页 .一开始用的是 SqlDataAdapter 的 public int Fill(DataSet, int, int, string); 但后来发现数据量一但很大时服务器的内存增长非常快 . 原因在这个DataSet 包含的记录数将不会多于由maxRecords 指示的记录数。但仍然从服务器返
前两天在做网站时需要手动分页 .一开始用的是 SqlDataAdapter 的 public int Fill(DataSet, int, int, string); 但后来发现数据量一但很大时服务器的内存增长非常快 . 原因在这个 DataSet 包含的记录数将不会多于由maxRecords 指示的记录数。但仍然从服务器返回该查询所生成的整个结果集。
最后只能改为sql存储过程(其实也是在网上抄来的 ). --这是分面的存储过程
CREATE PROCEDURE dbo.GetPagingRecord
(
@tablename varchar ( 100 ), -- 表名或视图表
@fieldlist varchar ( 4000 ) = ' * ' , -- 欲选择字段列表
@orderfield varchar ( 100 ), -- 排序字段
@keyfield varchar ( 100 ), -- 主键
@pageindex int , -- 页号,从0开始
@pagesize int = 20 , -- 页尺寸
@strwhere varchar ( 4000 ), -- 条件
@ordertype bit = 1 -- 排序,1,降序,0,升序
)
AS
/**/ /* *
名称:GetPagingRecord
作用:按任意字段进行排序分页
作者:菩提树(MARK MA)
时间:2004-12-14
*/
SET NOCOUNT ON
DECLARE @sqlstr varchar ( 6000 )
-- 处理SQL中危险字符,并且将条件处理成易嵌入的形式
SET @strwhere = replace ( @strwhere , '''' , '''''' )
SET @strwhere = replace ( @strwhere , ' -- ' , '' )
SET @strwhere = replace ( @strwhere , ' ; ' , '' )
SET @sqlstr = ' declare @CurPageNum int; '
SET @sqlstr = @sqlstr + ' declare @nextpagenum int; '
SET @sqlstr = @sqlstr + ' set @curpagenum= ' + cast ( @PageIndex as varchar ) + ' * ' + cast ( @Pagesize as varchar ) + ' ; '
SET @sqlstr = @sqlstr + ' set @nextpagenum= ' + cast ( @PageIndex + 1 as varchar ) + ' * ' + cast ( @Pagesize as varchar ) + ' ; '
SET @sqlstr = @sqlstr + ' declare @sqlstr varchar(6000); '
IF @ordertype = 1
BEGIN
SET @sqlstr = @sqlstr + ' set @sqlstr= '' select ' + @fieldlist + ' from ( select top '' +cast(@nextpagenum as varchar)+ '' * from
' + @tablename + ' where ' + @strwhere + ' order by ' + @orderfield + ' desc ) as a where ' + @keyfield + ' not in (
select top '' +cast(@curpagenum as varchar)+ '' ' + @keyfield + ' from ' + @tablename + ' where ' + @strwhere + '
order by ' + @orderfield + ' desc) order by ' + @orderfield + ' desc '' ; '
END
ELSE
BEGIN
SET @sqlstr = @sqlstr + ' set @sqlstr= '' select ' + @fieldlist + ' from ( select top '' +cast(@nextpagenum as varchar)+ '' * from
' + @tablename + ' where ' + @strwhere + ' order by ' + @orderfield + ' asc ) as a where ' + @keyfield + ' not in (
select top '' +cast(@curpagenum as varchar)+ '' ' + @keyfield + ' from ' + @tablename + ' where ' + @strwhere + '
order by ' + @orderfield + ' asc) order by ' + @orderfield + ' asc '' ; '
END
SET @sqlstr = @sqlstr + ' execute( @sqlstr) '
PRINT @sqlstr
EXECUTE ( @sqlstr )
GO
最近在关注sql server2005 ,其t-sql增强方面改了很多,而且网上也有网友写了相对应的分页代码,简单了很多,很值得一试噢。
查看更多关于分页显示的存储过程(sqlserver2k)的详细内容...