Stored Procedures pagination

 

None.gif CREATE   Proc  Page_GridView  
None.gif
@QueryStr   varchar ( 8000 ), -- 表名、视图名、查询语句  
None.gif
@PageSize   int = 10 , -- 每页的大小(行数)  
None.gif
@PageCurrent   int = 1 , -- 要显示的页  
None.gif
@FdShow   varchar  ( 8000 ) = '' , -- 要显示的字段列表,如果查询结果不需要标识字段,需要指定此值,且不包含标识字段  
None.gif
@FdOrder   nvarchar  ( 1000 ) = '' , -- 排序字段列表  
None.gif
@FDesc   nvarchar  ( 1000 ) = '' , -- 排序字方式  
None.gif
@tmpstr   varchar  ( 8000 ) = '' -- 超出8000字符
None.gif
  as  
None.gif
None.gif
-- set @QueryStr='Select * from Page_LeaveFormInfo  Where id in(3,4,5,6285,'
None.gif--
set @PageSize=999999
None.gif--
set @PageCurrent=1
None.gif--
set @FdShow=''
None.gif--
set @FdOrder='Code'
None.gif--
set @FDesc='asc'
None.gif--
set @tmpstr='9076,9077,9078,9079,9080)'
None.gif

None.gif
set  nocount  on   
None.gif
declare   @FdName   nvarchar ( 250 ) -- 表中的主键或表、临时表中的标识列名  
None.gif
, @Id1   varchar ( 20 ), @Id2   varchar ( 20 ) -- 开始和结束的记录号  
None.gif
, @Obj_ID   int -- 对象ID  
None.gif--
表中有复合主键的处理  
None.gif
declare   @strfd   varchar ( 8000 ) -- 复合主键列表  
None.gif
, @strjoin   varchar ( 8000 ) -- 连接字段  
None.gif
, @strwhere   varchar ( 8000 ) -- 查询条件 
None.gif

None.gif
select   @Obj_ID = object_id ( @QueryStr )  
None.gif,
@FdShow = case   isnull ( @FdShow , '' when   ''   then   '  * '   else   '   ' + @FdShow   end   
None.gif,
@FdOrder = case   isnull ( @FdOrder , '' when   ''   then   ''   else   '  order by  ' + @FdOrder + '   ' + @FDesc + '   '   end   
None.gif
None.gif
-- 如果显示第一页,可以直接用top来完成  
None.gif
if   @PageCurrent = 1   
None.gif
begin   
None.gif    
select   @Id1 = cast ( @PageSize   as   varchar ( 20 ))  
None.gif
-- print 'select top '+@Id1+@FdShow+' from '+'('+@QueryStr+@tmpstr+')'+ 'a' +@FdOrder
None.gif
     exec ( ' select top  ' + @Id1 + @FdShow + '  from  ' + ' ( ' + @QueryStr + @tmpstr + ' ) ' +   ' a ' + @FdOrder )  
None.gif    
return   
None.gif
end   
None.gif
None.gif
-- 如果是表,则检查表中是否有标识更或主键  
None.gif
if   @Obj_ID   is   not   null   and   objectproperty ( @Obj_ID , ' IsTable ' ) = 1   
None.gif
begin   
None.gif
select   @Id1 = cast ( @PageSize   as   varchar ( 20 ))  
None.gif,
@Id2 = cast (( @PageCurrent - 1 ) * @PageSize   as   varchar ( 20 ))  
None.gif  
None.gif
select   @FdName = name  from  syscolumns  where  id = @Obj_ID   and  status = 0x80   
None.gif
if   @@rowcount = 0 -- 如果表中无标识列,则检查表中是否有主键  
None.gif
begin   
None.gif
if   not   exists ( select   1   from  sysobjects  where  parent_obj = @Obj_ID   and  xtype = ' PK ' )  
None.gif
goto  lbusetemp -- 如果表中无主键,则用临时表处理  
None.gif
  
None.gif
select   @FdName = name  from  syscolumns  where  id = @Obj_ID   and  colid  in (  
None.gif
select  colid  from  sysindexkeys  where   @Obj_ID = id  and  indid  in (  
None.gif
select  indid  from  sysindexes  where   @Obj_ID = id  and  name  in (  
None.gif
select  name  from  sysobjects  where  xtype = ' PK '   and  parent_obj = @Obj_ID   
None.gif)))  
None.gif
if   @@rowcount > 1 -- 检查表中的主键是否为复合主键  
None.gif
begin   
None.gif
select   @strfd = '' , @strjoin = '' , @strwhere = ''   
None.gif
select   @strfd = @strfd + ' ,[ ' + name + ' ] '   
None.gif,
@strjoin = @strjoin + '  and a.[ ' + name + ' ]=b.[ ' + name + ' ] '   
None.gif,
@strwhere = @strwhere + '  and b.[ ' + name + ' ] is null '   
None.gif
from  syscolumns  where  id = @Obj_ID   and  colid  in (  
None.gif
select  colid  from  sysindexkeys  where   @Obj_ID = id  and  indid  in (  
None.gif
select  indid  from  sysindexes  where   @Obj_ID = id  and  name  in (  
None.gif
select  name  from  sysobjects  where  xtype = ' PK '   and  parent_obj = @Obj_ID   
None.gif)))  
None.gif
select   @strfd = substring ( @strfd , 2 , 8000 )  
None.gif,
@strjoin = substring ( @strjoin , 5 , 8000 )  
None.gif,
@strwhere = substring ( @strwhere , 5 , 8000 )  
None.gif
goto  lbusepk  
None.gif
end   
None.gif
end   
None.gif
end   
None.gif
else   
None.gif
goto  lbusetemp  
None.gif  
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*--使用标识列或主键为单一字段的处理方法--*/   
None.giflbuseidentity:  
None.gif
exec ( ' select top  ' + @Id1 + @FdShow + '  from  ' + @QueryStr   
None.gif
+ '  where  ' + @FdName + '  not in(select top  '   
None.gif
+ @Id2 + '   ' + @FdName + '  from  ' + ' ( ' + @QueryStr + @tmpstr + ' ) ' +   ' a ' + @FdOrder   
None.gif
+ ' ) ' + @FdOrder   
None.gif)  
None.gif
return   
None.gif  
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*--表中有复合主键的处理方法--*/   
None.giflbusepk:  
None.gif
exec ( ' select  ' + @FdShow + '  from(select top  ' + @Id1 + '  a.* from  
None.gif(select top 100 percent * from 
' + ' ( ' + @QueryStr + @tmpstr + ' ) ' +   ' a ' + @FdOrder + ' ) a  
None.gifleft join (select top 
' + @Id2 + '   ' + @strfd + '    
None.giffrom 
' + ' ( ' + @QueryStr + @tmpstr + ' ) ' +   ' a ' + @FdOrder + ' ) b on  ' + @strjoin + '   
None.gifwhere 
' + @strwhere + ' ) a '   
None.gif)  
None.gif
return   
None.gif  
ExpandedBlockStart.gifContractedBlock.gif
/**/ /*--用临时表处理的方法--*/   
None.giflbusetemp:  
None.gif
select   @FdName = ' [ID_ ' + cast ( newid ()  as   varchar ( 40 )) + ' ] '   
None.gif,
@Id1 = cast ( @PageSize * ( @PageCurrent - 1 as   varchar ( 20 ))  
None.gif,
@Id2 = cast ( @PageSize * @PageCurrent - 1   as   varchar ( 20 ))  
None.gif  
None.gif
if ( charindex ( ' top ' , @QueryStr ) = 0 )
None.gif
begin
None.gif    
set   @QueryStr = ltrim ( @QueryStr )
None.gif    
set   @QueryStr = ' select top 100 percent ' + substring ( @QueryStr , 7 , len ( @QueryStr ) - 6 )
None.gif
end
None.gif
exec ( ' select  ' + @FdName + ' =identity(int,0,1), ' + @FdShow + '     
None.gifinto #tb from
' + ' ( ' + @QueryStr + @tmpstr + @FdOrder   + ' ) ' +   ' a ' + '     
None.gifselect 
' + @FdShow + '  from #tb where  ' + @FdName + '  between  '     
None.gif
+ @Id1 + '  and  ' + @Id2
None.gif)

转载于:https://www.cnblogs.com/jiemupig/archive/2006/08/31/491069.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值