저장 프로세스 - 페이지 나누기

29548 단어 저장 프로세스
 /*--             

       、  、      X  

               ,         ,             

               ,       

  

 --   2003.09(        )--*/ 

  

 /**//*--     

  

 select top 20 * from product_schedule where brand='oem' 

 exec p_show 'product_schedule',10,2,'','schedule_id' 

  

 select top 20 * from product_schedule where brand='oem' and 1=2 

 exec p_show 'select schedule_id, priority, merchandising_team, merchandizer, customer,brand from product_schedule where brand=''oem'' and 1=1 ', 

 10,2,' priority, merchandising_team, merchandizer, customer','schedule_id' 

  

 select * from uv_product_report order by year,month,day,product_dest,brand,styling,qty 

 exec p_show 'uv_product_report',1500,4,'year,month,day,product_dest,brand,styling,qty','year,month,day,product_dest,brand,styling,qty' 

 --*/ 

  

 if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_show]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) 

 drop procedure [dbo].[p_show] 

 GO 

  

 CREATE Proc dbo. p_show 

 @QueryStr nvarchar(4000), --  、   、     

 @PageSize int=10,   --     (  ) 

 @PageCurrent int=1,   --      

 @FdShow nvarchar (4000)='',--        ,           ,      ,         

 @FdOrder nvarchar (1000)='' --       

 as 

 declare @FdName nvarchar(250) --

  ,@Id1 varchar(20),@Id2 varchar(20) --          

  ,@Obj_ID int    --  ID 

 --           

 declare @strfd nvarchar(2000) --       

  ,@strjoin nvarchar(4000) --     

  ,@strwhere nvarchar(2000) --     

  

  

 select @Obj_ID=object_id(@QueryStr) 

  ,@FdShow=case isnull(@FdShow,'') when '' then ' *' else ' '+@FdShow end 

  ,@FdOrder=case isnull(@FdOrder,'') when '' then '' else ' order by '+@FdOrder end 

  ,@QueryStr=case when @Obj_ID is not null then ' '+@QueryStr else ' ('+@QueryStr+') a' end 

  

 --       ,     top    

 if @PageCurrent=1  

 begin 

  select @Id1=cast(@PageSize as varchar(20)) 

  exec('select top '+@Id1+@FdShow+' from '+@QueryStr+@FdOrder) 

  return 

 end 

  

 --    ,               

 if @Obj_ID is not null and objectproperty(@Obj_ID,'IsTable')=1 

 begin 

  select @Id1=cast(@PageSize as varchar(20)) 

   ,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(20)) 

  

  select @FdName=name from syscolumns where id=@Obj_ID and status=0x80 

  if @@rowcount=0   --        ,           

  begin 

   if not exists(select 1 from sysobjects where parent_obj=@Obj_ID and xtype='PK') 

    goto lbusetemp  --       ,        

  

   select @FdName=name from syscolumns where id=@Obj_ID and 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_ID and 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,2000) 

     ,@strjoin=substring(@strjoin,5,4000) 

     ,@strwhere=substring(@strwhere,5,4000) 

    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+@FdOrder 

   +')'+@FdOrder 

   ) 

  return 

  

 /**//*--            --*/ 

 lbusepk:   

  exec('select '+@FdShow+' from(select top '+@Id1+' a.* from 

   (select top 100 percent * from '+@QueryStr+@FdOrder+') a 

   left join (select top '+@Id2+' '+@strfd+'  

   from '+@QueryStr+@FdOrder+') b on '+@strjoin+' 

   where '+@strwhere+') a' 

   ) 

  return 

  

 /**//*--         --*/ 

 lbusetemp:   

 select @FdName='[ID_'+cast(newid() as varchar(40))+']' 

  ,@Id1=cast(@PageSize*(@PageCurrent-1) as varchar(20)) 

  ,@Id2=cast(@PageSize*@PageCurrent-1 as varchar(20)) 

  

 exec('select '+@FdName+'=identity(int,0,1),'+@FdShow+' 

   into #tb from'+@QueryStr+@FdOrder+' 

  select '+@FdShow+' from #tb where '+@FdName+' between ' 

  +@Id1+' and '+@Id2 

  ) 

 GO 

좋은 웹페이지 즐겨찾기