IFOBJECT_ID(N'dbo.p_show')ISNOTNULLDROPPROCEDUREdbo.p_showGO/**//*--实现分页的通用存储过程显示指定表、视图、查询结果的第X页对于表中主键或标识列的情况,直接从原表取数查询,其它情况使用临时表的方法如果视图或查询结果中有主键,不推荐此方法如果使用查询语句,而且查询语句使用了orderby,则查询语句必须包含top语句最后更新时间:2008.01.20--邹建2003.09(引用请保留此信息)--*//**//*--调用示例EXECdbo.p_show@QueryStr=N'tb',@PageSize=5,@PageCurrent=3,@FdShow='id,colid,name',@FdOrder='colid,name'selectid,colidfromtborderbycolid,nameEXECdbo.p_show@QueryStr=N'SELECTTOP100PERCENT*FROMdbo.sysobjectsORDERBYxtype',@PageSize=5,@PageCurrent=2,@FdShow='name,xtype',@FdOrder='xtype,name'--*/CREATEPROCdbo.p_show@QueryStrnvarchar(4000),--表名、视图名、查询语句@PageSizeint=10,--每页的大小(行数)@PageCurrentint=1,--要显示的页@FdShownvarchar(4000)=N'',--要显示的字段列表,如果查询结果不需要标识字段,需要指定此值,且不包含标识字段@FdOrdernvarchar(1000)=N''--排序字段列表ASSETNOCOUNTONDECLARE@FdNamesysname,--表中的主键或表、临时表中的标识列名@Id1sysname,--开始和结束的记录号@Id2sysname,@Obj_IDint--对象ID--表中有复合主键的处理DECLARE@strfdnvarchar(2000),--复合主键列表@strjoinnvarchar(4000),--连接字段@strwherenvarchar(2000)--查询条件SELECT@Obj_ID=OBJECT_ID(@QueryStr),@FdShow=CASEWHEN@FdShow>N''THENN''+@FdShowELSEN'*'END,@FdOrder=CASEWHEN@FdOrder>N''THENN'ORDERBY'+@FdOrderELSEN''END,@QueryStr=CASEWHEN@Obj_IDISNULLTHENN'('+@QueryStr+N')A'ELSEN''+@QueryStrEND--如果显示第一页,可以直接用top来完成IF@PageCurrent=1BEGINSELECT@Id1=CAST(@PageSizeasvarchar(20))EXEC(N'SELECTTOP'+@Id1+N''+@FdShow+N'FROM'+@QueryStr+N''+@FdOrder)RETURNEND--如果是表,则检查表中是否有标识更或主键IF@Obj_IDISNULLOROBJECTPROPERTY(@Obj_ID,'IsTable')=0GOTOlb_usetempELSEBEGINSELECT@Id1=CAST(@PageSizeasvarchar(20)),@Id2=CAST((@PageCurrent-1)*@PageSizeasvarchar(20))--标识列SELECT@FdName=nameFROMdbo.syscolumnsWHEREid=@Obj_IDANDstatus=0x80IF@@ROWCOUNT=0--如果表中无标识列,则检查表中是否有主键BEGINDECLARE@pk_numberintSELECT@strfd=N'',@strjoin=N'',@strwhere=N''SELECT@strfd=@strfd+N','+QUOTENAME(name),@strjoin=@strjoin+N'ANDA.'+QUOTENAME(name)+N'=B.'+QUOTENAME(name),@strwhere=@strwhere+N'ANDB.'+QUOTENAME(name)+N'ISNULL'FROM(SELECTIX.id,IX.indid,IXC.colid,ixc.keyno,C.nameFROMdbo.sysobjectsO,dbo.sysindexesIX,dbo.sysindexkeysIXC,dbo.syscolumnsCWHEREO.parent_obj=@Obj_IDANDO.xtype='PK'ANDO.name=IX.nameANDIX.id=@Obj_IDANDIX.id=IXC.idANDIX.indid=IXC.indidANDIXC.id=C.idANDIXC.colid=C.colid)AORDERBYkeynoSELECT@pk_number=@@ROWCOUNT,@strfd=STUFF(@strfd,1,1,N''),@strjoin=STUFF(@strjoin,1,5,N''),@strwhere=STUFF(@strwhere,1,5,N'')IF@pk_number=0GOTOlb_usetemp--如果表中无主键,则用临时表处理ELSEIF@pk_number=1BEGINSELECT@FdName=@strfdGOTOlb_useidentity--使用单一主键ENDELSEGOTOlb_usepk--使用复合主键ENDEND/**//*--使用标识列或主键为单一字段的处理方法--*/lb_useidentity:EXEC(N'SELECTTOP'+@Id1+N''+@FdShow+N'FROM'+@QueryStr+N'WHERE'+@FdName+'NOTIN(SELECTTOP'+@Id2+N''+@FdName+'FROM'+@QueryStr+N''+@FdOrder+N')'+@FdOrder+N'')RETURN/**//*--表中有复合主键的处理方法--*/lb_usepk:EXEC(N'SELECT'+@FdShow+N'FROM(SELECTTOP'+@Id1+N'A.*FROM'+@QueryStr+N'ALEFTJOIN(SELECTTOP'+@Id2+N''+@strfd+N'FROM'+@QueryStr+N''+@FdOrder+N')BON'+@strjoin+N'WHERE'+@strwhere+N''+@FdOrder+N')A'+@FdOrder+N'')RETURN/**//*--用临时表处理的方法--*/lb_usetemp:SELECT@FdName=QUOTENAME(N'ID_'+CAST(NEWID()asvarchar(40))),@Id1=CAST(@PageSize*(@PageCurrent-1)asvarchar(20)),@Id2=CAST(@PageSize*@PageCurrent-1asvarchar(20))EXEC(N'SELECT'