BDE的Query查询结果分页(100分)

  • 主题发起人 主题发起人 kingming
  • 开始时间 开始时间
K

kingming

Unregistered / Unconfirmed
GUEST, unregistred user!
如果我的表记录有许多条,需要分页,用什么分布方法?<br>主要是想降低数据库的压力,每次只返回其中的二三十行。 望熟人指点一二!
 
ClientDataset
 
给你个存储过程,希望对你有用<br><br><br>Create &nbsp;Proc p_show<br><br>/*--用存储过程实现的分页程序<br><br>&nbsp;显示指定表、视图、查询结果的第X页<br>&nbsp;对于表中主键或标识列的情况,直接从原表取数查询,其它情况使用临时表的方法<br>&nbsp;如果视图或查询结果中有主键,不推荐此方法<br><br>--邹建 2003.09(引用请保留此信息)--*/<br><br>/*--调用示例<br>&nbsp;exec p_show '地区资料'<br><br>&nbsp;exec p_show '地区资料',5,3,'地区编号,地区名称,助记码','地区编号'<br>--*/<br><br>@QueryStr nvarchar(4000), --表名、视图名、查询语句<br>@FdOrder nvarchar (1000)='', --排序字段列表<br>@PageCurrent int=1, &nbsp; --要显示的页<br>@PageSize int=10, &nbsp; --每页的大小(行数)<br>@FdShow nvarchar (4000)='' --要显示的字段列表,如果查询结果有标识字段,需要指定此值,且不包含标识字段<br>as<br>if @PageCurrent&lt;=0<br> set @PageCurrent=1<br>declare @FdName nvarchar(250) --表中的主键或表、临时表中的标识列名<br>&nbsp;,@Id1 varchar(20),@Id2 varchar(20) --开始和结束的记录号<br>&nbsp;,@Obj_ID int &nbsp; &nbsp;--对象ID<br>--表中有复合主键的处理<br>declare @strfd nvarchar(2000) --复合主键列表<br>&nbsp;,@strjoin nvarchar(4000) --连接字段<br>&nbsp;,@strwhere nvarchar(2000) --查询条件<br><br><br>select @Obj_ID=object_id(@QueryStr)<br>&nbsp;,@FdShow=case isnull(@FdShow,'') when '' then ' *' else ' '+@FdShow end<br>&nbsp;,@FdOrder=case isnull(@FdOrder,'') when '' then '' else ' order by '+@FdOrder end<br>&nbsp;,@QueryStr=case when @Obj_ID is not null then ' '+@QueryStr else ' ('+@QueryStr+') a' end<br><br>--如果显示第一页,可以直接用top来完成<br>if @PageCurrent=1 <br>begin<br>&nbsp;select @Id1=cast(@PageSize as varchar(20))<br>&nbsp;exec('select top '+@Id1+@FdShow+' from '+@QueryStr+@FdOrder)<br>&nbsp;return<br>end<br><br>--如果是表,则检查表中是否有标识更或主键<br>if @Obj_ID is not null and objectproperty(@Obj_ID,'IsTable')=1<br>begin<br>&nbsp;select @Id1=cast(@PageSize as varchar(20))<br>&nbsp; ,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(20))<br><br>&nbsp;select @FdName=name from syscolumns where id=@Obj_ID and status=0x80<br>&nbsp;if @@rowcount=0 &nbsp; --如果表中无标识列,则检查表中是否有主键<br>&nbsp;begin<br>&nbsp; if not exists(select 1 from sysobjects where parent_obj=@Obj_ID and xtype='PK')<br>&nbsp; &nbsp;goto lbusetemp &nbsp;--如果表中无主键,则用临时表处理<br><br>&nbsp; select @FdName=name from syscolumns where id=@Obj_ID and colid in(<br>&nbsp; &nbsp;select colid from sysindexkeys where @Obj_ID=id and indid in(<br>&nbsp; &nbsp; select indid from sysindexes where @Obj_ID=id and name in(<br>&nbsp; &nbsp; &nbsp;select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID<br>&nbsp; &nbsp;)))<br>&nbsp; if @@rowcount&gt;1 &nbsp;--检查表中的主键是否为复合主键<br>&nbsp; begin<br>&nbsp; &nbsp;select @strfd='',@strjoin='',@strwhere=''<br>&nbsp; &nbsp;select @strfd=@strfd+',['+name+']'<br>&nbsp; &nbsp; ,@strjoin=@strjoin+' and a.['+name+']=b.['+name+']'<br>&nbsp; &nbsp; ,@strwhere=@strwhere+' and b.['+name+'] is null'<br>&nbsp; &nbsp; from syscolumns where id=@Obj_ID and colid in(<br>&nbsp; &nbsp; select colid from sysindexkeys where @Obj_ID=id and indid in(<br>&nbsp; &nbsp; &nbsp;select indid from sysindexes where @Obj_ID=id and name in(<br>&nbsp; &nbsp; &nbsp; select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID<br>&nbsp; &nbsp; )))<br>&nbsp; &nbsp;select @strfd=substring(@strfd,2,2000)<br>&nbsp; &nbsp; ,@strjoin=substring(@strjoin,5,4000)<br>&nbsp; &nbsp; ,@strwhere=substring(@strwhere,5,4000)<br>&nbsp; &nbsp;goto lbusepk<br>&nbsp; end<br>&nbsp;end<br>end<br>else<br>&nbsp;goto lbusetemp<br><br>/*--使用标识列或主键为单一字段的处理方法--*/<br>lbuseidentity: <br>&nbsp;exec('select top '+@Id1+@FdShow+' from '+@QueryStr<br>&nbsp; +' where '+@FdName+' not in(select top '<br>&nbsp; +@Id2+' '+@FdName+' from '+@QueryStr+@FdOrder<br>&nbsp; +')'+@FdOrder<br>&nbsp; )<br>&nbsp;return<br><br>/*--表中有复合主键的处理方法--*/<br>lbusepk: &nbsp;<br>&nbsp;exec('select '+@FdShow+' from(select top '+@Id1+' a.* from<br>&nbsp; (select top 100 percent * from '+@QueryStr+@FdOrder+') a<br>&nbsp; left join (select top '+@Id2+' '+@strfd+' <br>&nbsp; from '+@QueryStr+@FdOrder+') b on '+@strjoin+'<br>&nbsp; where '+@strwhere+') a'<br>&nbsp; )<br>&nbsp;return<br><br>/*--用临时表处理的方法--*/<br>lbusetemp: &nbsp;<br><br>select @FdName='[ID_'+cast(newid() as varchar(40))+']'<br>&nbsp;,@Id1=cast(@PageSize*(@PageCurrent-1) as varchar(20))<br>&nbsp;,@Id2=cast(@PageSize*@PageCurrent-1 as varchar(20))<br>print 'select '+@FdName+'=identity(int,0,1),'+@FdShow+'<br>&nbsp; into #tb from'+@QueryStr+@FdOrder+'<br>&nbsp;select '+@FdShow+' from #tb where '+@FdName+' between '<br>&nbsp;+@Id1+' and '+@Id2<br>exec('select '+@FdName+'=identity(int,0,1),'+@FdShow+'<br>&nbsp; into #tb from'+@QueryStr+@FdOrder+'<br>&nbsp;select '+@FdShow+' from #tb where '+@FdName+' between '<br>&nbsp;+@Id1+' and '+@Id2<br>&nbsp;)<br><br>GO
 
OK~~ &nbsp;THSVM
 
后退
顶部