/--用存储过程实现的分页程序 显示指定表、视图、查询结果的第X页 对于表中主键或标识列的情况,直接从原表取数查询,其它情况使用临时表的方法 如果视图或查询结果中有主键,不推荐此方法 --邹建2003.09--/ /--调用示例 execp_show'地区资料' execp_show'地区资料',5,3,'地区编号,地区名称,助记码','地区编号' --/ / 因为要顾及通用性,所以对带排序的查询语句有一定要求.如果先排序,再出结果.就是: execp_show'selecttop100percentfrom地区资料orderby地区名称','地区名称' --查询语句加上:top100percent//top时 / ifexists(selectfromdbo.sysobjectswhereid=object_id(N'[dbo].[p_show]')andOBJECTPROPERTY(id,N'IsProcedure')=1) dropprocedure[dbo].[p_show] GO CreateProcp_show @QueryStrnvarchar(4000),--表名、视图名、查询语句 @PageSizeint=10,--每页的大小(行数) @PageCurrentint=1,--要显示的页 @FdShownvarchar(4000)='',--要显示的字段列表,如果查询结果有标识字段,需要指定此值,且不包含标识字段 @FdOrdernvarchar(1000)=''--排序字段列表 as declare@FdNamenvarchar(250)--表中的主键或表、临时表中的标识列名 ,@Id1varchar(20),@Id2varchar(20)--开始和结束的记录号 ,@Obj_IDint--对象ID --表中有复合主键的处理 declare@strfdnvarchar(2000)--复合主键列表 ,@strjoinnvarchar(4000)--连接字段 ,@strwherenvarchar(2000)--查询条件 select@Obj_ID=object_id(@QueryStr) ,@FdShow=caseisnull(@FdShow,'')when''then''else''+@FdShowend ,@FdOrder=caseisnull(@FdOrder,'')when''then''else'orderby'+@FdOrderend ,@QueryStr=casewhen@Obj_IDisnotnullthen''+@QueryStrelse'('+@QueryStr+')a'end --如果显示第一页,可以直接用top来完成 if@PageCurrent=1 begin select@Id1=cast(@PageSizeasvarchar(20)) exec('selecttop'+@Id1+@FdShow+'from'+@QueryStr+@FdOrder) return end --如果是表,则检查表中是否有标识更或主键 if@Obj_IDisnotnullandobjectproperty(@Obj_ID,'IsTable')=1 begin select@Id1=cast(@PageSizeasvarchar(20)) ,@Id2=cast((@PageCurrent-1)@PageSizeasvarchar(20)) select@FdName=namefromsyscolumnswhereid=@Obj_IDandstatus=0x80 if@@rowcount=0--如果表中无标识列,则检查表中是否有主键 begin ifnotexists(select1fromsysobjectswhereparent_obj=@Obj_IDandxtype='PK') gotolbusetemp--如果表中无主键,则用临时表处理 select@FdName=namefromsyscolumnswhereid=@Obj_IDandcolidin( selectcolidfromsysindexkeyswhere@Obj_ID=idandindidin( selectindidfromsysindexeswhere@Obj_ID=idandnamein( selectnamefromsysobjectswherextype='PK'andparent_obj=@Obj_ID ))) if@@rowcount>1--检查表中的主键是否为复合主键 begin select@strfd='',@strjoin='',@strwhere='' select@strfd=@strfd+',['+name+']' ,@strjoin=@strjoin+'anda.['+name+']=b.['+name+']' ,@strwhere=@strwhere+'andb.['+name+']isnull' fromsyscolumnswhereid=@Obj_IDandcolidin( selectcolidfromsysindexkeyswhere@Obj_ID=idandindidin( selectindidfromsysindexeswhere@Obj_ID=idandnamein( selectnamefromsysobjectswherextype='PK'andparent_obj=@ObjID ))) select@strfd=substring(@strfd,2,2000) ,@strjoin=substring(@strjoin,4000) ,@strwhere=substring(@strwhere,4000) gotolbusepk end end end else gotolbusetemp /--使用标识列或主键为单一字段的处理方法--/ lbuseidentity: exec('selecttop'+@Id1+@FdShow+'from'+@QueryStr +'where'+@FdName+'notin(selecttop' +@Id2+''+@FdName+'from'+@QueryStr+@FdOrder +')'+@FdOrder ) return /--表中有复合主键的处理方法--/ lbusepk: exec('select'+@FdShow+'from(selecttop'+@Id1+'a.from (selecttop100percentfrom'+@QueryStr+@FdOrder+')a leftjoin(selecttop'+@Id2+''+@strfd+' from'+@QueryStr+@FdOrder+')bon'+@strjoin+' where'+@strwhere+')a' ) return /--用临时表处理的方法--/ lbusetemp: select@FdName='[ID'+cast(newid()asvarchar(40))+']' ,@Id1=cast(@PageSize(@PageCurrent-1)asvarchar(20)) ,@Id2=cast(@PageSize@PageCurrent-1asvarchar(20)) exec('select'+@FdName+'=identity(int,1),'+@FdShow+' into#tbfrom'+@QueryStr+@FdOrder+' select'+@FdShow+'from#tbwhere'+@FdName+'between' +@Id1+'and'+@Id2 ) GO
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|