CREATEProc Page_GridView @QueryStrvarchar(8000),--表名、视图名、查询语句 @PageSizeint=10,--每页的大小(行数) @PageCurrentint=1,--要显示的页 @FdShowvarchar (8000)='',--要显示的字段列表,如果查询结果不需要标识字段,需要指定此值,且不包含标识字段 @FdOrdernvarchar (1000)='',--排序字段列表 @FDescnvarchar (1000)='',--排序字方式 @tmpstrvarchar (8000)=''--超出8000字符 as --set @QueryStr='Select * from Page_LeaveFormInfo Where id in(3,4,5,6285,' --set @PageSize=999999 --set @PageCurrent=1 --set @FdShow='' --set @FdOrder='Code' --set @FDesc='asc' --set @tmpstr='9076,9077,9078,9079,9080)' set nocount on declare@FdNamenvarchar(250)--表中的主键或表、临时表中的标识列名 ,@Id1varchar(20),@Id2varchar(20)--开始和结束的记录号 ,@Obj_IDint--对象ID --表中有复合主键的处理 declare@strfdvarchar(8000)--复合主键列表 ,@strjoinvarchar(8000)--连接字段 ,@strwherevarchar(8000)--查询条件 select@Obj_ID=object_id(@QueryStr) ,@FdShow=caseisnull(@FdShow,'') when''then' *'else''+@FdShowend ,@FdOrder=caseisnull(@FdOrder,'') when''then''else' order by '+@FdOrder+''+@FDesc+''end --如果显示第一页,可以直接用top来完成 if@PageCurrent=1 begin select@Id1=cast(@PageSizeasvarchar(20)) --print 'select top '+@Id1+@FdShow+' from '+'('+@QueryStr+@tmpstr+')'+ 'a' +@FdOrder exec('select top '+@Id1+@FdShow+' from '+'('+@QueryStr+@tmpstr+')'+'a'+@FdOrder) return end --如果是表,则检查表中是否有标识更或主键 if@Obj_IDisnotnullandobjectproperty(@Obj_ID,'IsTable')=1 begin select@Id1=cast(@PageSizeasvarchar(20)) ,@Id2=cast((@PageCurrent-1)*@PageSizeasvarchar(20)) select@FdName=name from syscolumns where id=@Obj_IDand status=0x80 if@@rowcount=0--如果表中无标识列,则检查表中是否有主键 begin ifnotexists(select1from sysobjects where parent_obj=@Obj_IDand xtype='PK') goto lbusetemp--如果表中无主键,则用临时表处理 select@FdName=name from syscolumns where id=@Obj_IDand colid in( select colid from sysindexkeys where@Obj_ID=id and indid in( select indid from sysindexes where@Obj_ID=id and name in( select name from sysobjects where xtype='PK'and parent_obj=@Obj_ID ))) if@@rowcount>1--检查表中的主键是否为复合主键 begin select@strfd='',@strjoin='',@strwhere='' select@strfd=@strfd+',['+name+']' ,@strjoin=@strjoin+' and a.['+name+']=b.['+name+']' ,@strwhere=@strwhere+' and b.['+name+'] is null' from syscolumns where id=@Obj_IDand colid in( select colid from sysindexkeys where@Obj_ID=id and indid in( select indid from sysindexes where@Obj_ID=id and name in( select name from sysobjects where xtype='PK'and parent_obj=@Obj_ID ))) select@strfd=substring(@strfd,2,8000) ,@strjoin=substring(@strjoin,5,8000) ,@strwhere=substring(@strwhere,5,8000) goto lbusepk end end end else goto lbusetemp /**//*--使用标识列或主键为单一字段的处理方法--*/ lbuseidentity: exec('select top '+@Id1+@FdShow+' from '+@QueryStr +' where '+@FdName+' not in(select top ' +@Id2+''+@FdName+' from '+'('+@QueryStr+@tmpstr+')'+'a'+@FdOrder +')'+@FdOrder ) return /**//*--表中有复合主键的处理方法--*/ lbusepk: exec('select '+@FdShow+' from(select top '+@Id1+' a.* from (select top 100 percent * from '+'('+@QueryStr+@tmpstr+')'+'a'+@FdOrder+') a left join (select top '+@Id2+''+@strfd+' from '+'('+@QueryStr+@tmpstr+')'+'a'+@FdOrder+') b on '+@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)) if(charindex('top',@QueryStr)=0) begin set@QueryStr=ltrim(@QueryStr) set@QueryStr='select top 100 percent'+substring(@QueryStr,7,len(@QueryStr)-6) end exec('select '+@FdName+'=identity(int,0,1),'+@FdShow+' into #tb from'+'('+@QueryStr+@tmpstr+@FdOrder+')'+'a'+' select '+@FdShow+' from #tb where '+@FdName+' between ' +@Id1+' and '+@Id2 )