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