page procedures

EXEC XK_Counter_UpdateEveryDayRankTempTable
sp_helptext XK_Counter_UpdateEveryDayRankTempTable

select getdate()
exec GetPagingData 
' article ' , ' * ' , ' UpdateTime ' , ' id ' , 1 , 20 , ' 1=1 ' , 1
select getdate()
select getdate()
exec GZ_News_GetSQLSearchResults 
20 , 1 , ''
select getdate()

sp_helptext GZ_News_GetSQLSearchResults
 
------------------------- 以下为临时表分页存储过程(不会有排序字段的影响) --------------------------------------------------------
CREATE     PROCEDURE GZ_News_GetSQLSearchResults   
(  
   
 @PageSize 
int ,  
 @PageIndex 
int ,   
        @Content varchar(
20 )  
)  
AS  
 SET NOCOUNT ON  
  
 DECLARE @PageLowerBound 
int   
 DECLARE @PageUpperBound 
int   
 DECLARE @RowsToReturn 
int   
 DECLARE @MoreRecords 
int   
   
  
 SET @RowsToReturn 
=  @PageSize  *  @PageIndex  
 SET @MoreRecords 
=  @RowsToReturn  +   1   
 SET ROWCOUNT @MoreRecords  
  
  
 SET @PageLowerBound 
=  @PageSize  *  (@PageIndex - 1 )  
 SET @PageUpperBound 
=  @PageLowerBound  +  @PageSize  +   1   
  
 CREATE TABLE #PageIndex   
 (  
  IndexID 
int  IDENTITY ( 1 1 ) NOT NULL,  
  UpdateTime datetime,  
                ArticleID 
int   
 )  
  
  
        
if ((@Content  is  not  null ) and (@Content <> '' ))   
  INSERT INTO #PageIndex (ArticleID,UpdateTime)   
 (SELECT ArticleID,UpdateTime FROM Article a WHERE Contains(Content, @Content)  
                union   
                SELECT ArticleID,UpdateTime FROM Article a where Contains(Title,@Content))   ORDER BY UpdateTime Desc   
  
        
else    
                INSERT INTO #PageIndex(ArticleID)  
                SELECT ArticleID  FROM Article a Order By UpdateTime desc  
  
        
/* IF (@MoreRecords > (SELECT count(*) FROM #PageIndex))  
  SET @MoreRecords = @RowsToReturn
*/   
  
 SELECT  
  a.ArticleID,  
                a.Title,  
                a.UpdateTime,  
                a.Content,  
                a.IncludePic,  
                a.DefaultPicUrl,  
                a.CopyFrom  
    
 FROM   
  #PageIndex PageIndex,  
  Article a  
    
 WHERE   
  a.ArticleID 
=  PageIndex.ArticleID AND  
  PageIndex.IndexID 
>  @PageLowerBound AND  
  PageIndex.IndexID 
<  @PageUpperBound  
 ORDER BY   
  PageIndex.IndexID  
  
  
 SET NOCOUNT OFF
----------------------------------------------------------- 排序类型 ----------------------------------------------------------------------

drop proc getpagingdata
create PROCEDURE dbo.GetPagingData 
    ( 
        @tablename varchar(
100 ), -- 表名或视图表 
        @fieldlist varchar(
4000 ) = ' * ' , -- 欲选择字段列表 
        @orderfield varchar(
100 ), -- 排序字段 
        @keyfield varchar(
100 ), -- 主键 
        @pageindex 
int , -- 页号,从0开始 
        @pagesize 
int = 20 , -- 页尺寸 
        @strwhere varchar(
4000 ), -- 条件 
        @ordertype bit
= 1 -- 排序, 1 ,降序, 0 ,升序 
    ) 
AS 
    SET NOCOUNT ON 
    declare @sqlstr varchar(
6000
    
-- 处理SQL中危险字符,并且将条件处理成易嵌入的形式     
    
set  @sqlstr = ' declare @Rcount int; '  
  
--    set  @sqlstr = @sqlstr + ' set @rcount=(select count( ' + @keyfield + ' ) from  ' + @tablename + '  where  ' + @strWhere + ' ); '   
    
set  @sqlstr = @sqlstr + ' set @rcount=1000 '    
    
set  @strwhere = replace(@strwhere, '''' , ''''''
    
set  @strwhere = replace(@strwhere, ' -- ' , ''
    
set  @strwhere = replace(@strwhere, ' ; ' , ''
    
set  @sqlstr = @sqlstr + ' declare @Rnum int; '  
    
set  @sqlstr = @sqlstr + ' set @rnum=@rcount- ' + cast(@pagesize  as  varchar) + ' * ' + cast(@pageindex  as  varchar) + ' ; '  
    
set  @sqlstr = @sqlstr + ' declare @sqlstr varchar(6000); '  
    
if  @ordertype = 1  
    begin 
    
set  @sqlstr = @sqlstr + ' set @sqlstr= '' select top  ' + cast(@Pagesize  as  varchar) + '   ' + @fieldlist + '  from (select top 100  
 
percent 
*  from  (select top   '' + cast(@rnum  as  varchar) + ''   *  from  ' +@tablename+ '  where  ' +@strwhere+ '   
 
order by 
' +@orderfield+ '  asc)  as  b order by UpdateTime desc)  as  a order by  ' +@orderfield+ '  desc  '' ; '  
    end 
    
else  
    begin 
    
set  @sqlstr = @sqlstr + ' set @sqlstr= '' select top  ' + cast(@Pagesize  as  varchar) + '   ' + @fieldlist + '  from (select top 100  
 
percent 
*  from  (select top   '' + cast(@rnum  as  varchar) + ''   *  from  ' +@tablename+ '  where  ' +@strwhere+ '   
 
order by 
' +@orderfield+ '  desc)  as  b order by UpdateTime asc)  as  a order by  ' +@orderfield+ '  asc  '' ; '  
    end 
    
set  @sqlstr = @sqlstr + ' if @Rcount>0 begin execute(@sqlstr) end '      
   print @sqlstr 
    execute(@sqlstr)
go
 
 

------------------------------------------------- not  in   ---------------------------------------------------------------------
select getdate()
exec GetPagingRecord_notin 
' article ' , ' * ' , ' UpdateTime ' , ' id ' , 0 , 20 , ' 1=1 ' , 1
select getdate()
create PROCEDURE dbo.GetPagingRecord_notin 
    ( 
        @tablename varchar(
100 ), -- 表名或视图表 
        @fieldlist varchar(
4000 ) = ' * ' , -- 欲选择字段列表 
        @orderfield varchar(
100 ), -- 排序字段 
        @keyfield varchar(
100 ), -- 主键 
        @pageindex 
int , -- 页号,从0开始 
        @pagesize 
int = 20 , -- 页尺寸 
        @strwhere varchar(
4000 ), -- 条件 
        @ordertype bit
= 1 -- 排序, 1 ,降序, 0 ,升序 
    ) 
AS 
 SET NOCOUNT ON 
    declare @sqlstr varchar(
6000
    
-- 处理SQL中危险字符,并且将条件处理成易嵌入的形式 
    
set  @strwhere = replace(@strwhere, '''' , ''''''
    
set  @strwhere = replace(@strwhere, ' -- ' , ''
    
set  @strwhere = replace(@strwhere, ' ; ' , ''
    
set  @sqlstr = ' declare @CurPageNum int; '  
    
set  @sqlstr = @sqlstr + ' declare @nextpagenum int; '  
    
set  @sqlstr = @sqlstr + ' set @curpagenum= ' + cast(@PageIndex  as  varchar) + ' * ' + cast(@Pagesize  as  varchar) + ' ; '  
    
set  @sqlstr = @sqlstr + ' set @nextpagenum= ' + cast(@PageIndex + 1   as  varchar) + ' * ' + cast(@Pagesize  as  varchar) + ' ; '  
    
set  @sqlstr = @sqlstr + ' declare @sqlstr varchar(6000); '  
    
if  @ordertype = 1  
    begin 
    
set  @sqlstr = @sqlstr + ' set @sqlstr= '' select  ' + @fieldlist + '  from ( select top  '' +cast(@nextpagenum as varchar)+ ''  * from  
 
' +@tablename+ '   where  ' +@strwhere+ '  order by  ' +@orderfield+ '  desc )  as  a where  ' +@keyfield+ '  not  in  (  
 
select top 
'' + cast(@curpagenum  as  varchar) + ''   ' +@keyfield+ '  from  ' +@tablename+ '  where  ' +@strwhere+ '   
 
order by 
' +@orderfield+ '  desc) order by  ' +@orderfield+ '  desc '' ; '  
    end 
    
else  
    begin 
    
set  @sqlstr = @sqlstr + ' set @sqlstr= '' select  ' + @fieldlist + '  from ( select top  '' +cast(@nextpagenum as varchar)+ ''  * from  
 
' +@tablename+ '   where  ' +@strwhere+ '  order by  ' +@orderfield+ '  asc )  as  a where  ' +@keyfield+ '  not  in  (  
 
select top 
'' + cast(@curpagenum  as  varchar) + ''   ' +@keyfield+ '  from  ' +@tablename+ '  where  ' +@strwhere+ '   
 
order by 
' +@orderfield+ '  asc) order by  ' +@orderfield+ '  asc '' ; '  
    end 
    
set  @sqlstr = @sqlstr + ' execute( @sqlstr) '  
    
-- print @sqlstr 
    execute(@sqlstr) 
------------------------------------------  目前最好的存储过程  ----------------------------------------------------------------------

select getdate()
exec proc_pagination 
' ARTICLE ' , ' * ' , ' UpdateTime ' , 20 , 1 , 0 , 1 , ''
select getdate()
 
CREATE    PROCEDURE proc_pagination(
 @tblName   varchar(
255 ),        --  表名
 @strGetFields varchar(
1000 =   ' * ' ,   --  需要返回的列 
 @fldName varchar(
255 ) = '' ,       --  排序的字段名
 @PageSize   
int   =   10 ,           --  页尺寸
 @PageIndex  
int   =   1 ,            --  页码
 @doCount  bit 
=   0 ,    --  返回记录总数, 非  0  值则返回
 @OrderType bit 
=   0 ,   --  设置排序类型, 非  0  值则降序
 @strWhere  varchar(
1500 =   ''    --  查询条件 (注意: 不要加 where)
) AS
 
set  nocount on
 declare @strSQL   varchar(
5000 )        --  主语句
 declare @strTmp   varchar(
110 )         --  临时变量
 declare @strOrder varchar(
400 )         --  排序类型
 
 
if  @doCount  !=   0
   begin
     
if  @strWhere  != ''
      
set  @strSQL  =   ' select count(*) as Total from [ '   +  @tblName  +   ' ] where  ' + @strWhere
     
else
      
set  @strSQL  =   ' select count(*) as Total from [ '   +  @tblName  +   ' ] '
  end  
 
-- 以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
 
else
 begin
  
if  @OrderType  !=   0
  begin
      
set  @strTmp  =   ' <(select min '
   
set  @strOrder  =   '  order by [ '   +  @fldName  + ' ] desc '
   
-- 如果@OrderType不是0,就执行降序,这句很重要!
  end
  
else
  begin
      
set  @strTmp  =   ' >(select max '
      
set  @strOrder  =   '  order by [ '   +  @fldName  + ' ] asc '
  end
  
if  @PageIndex  =   1
  begin
      
if  @strWhere  !=   ''    
       
set  @strSQL  =   ' select top  '   +  str(@PageSize)  + '   ' + @strGetFields +   '   from [ '   +  @tblName  +   ' ] where  '   +  @strWhere  +   '   '   +  @strOrder
   
else
       
set  @strSQL  =   ' select top  '   +  str(@PageSize)  + '   ' + @strGetFields +   '   from [ ' +  @tblName  +   ' ' +  @strOrder
   
-- 如果是第一页就执行以上代码,这样会加快执行速度
  end
  
else
  begin
   
-- 以下代码赋予了@strSQL以真正执行的SQL代码
   
set  @strSQL  =   ' select top  '   +  str(@PageSize)  + '   ' + @strGetFields +   '   from [ '
       
+  @tblName  +   ' ] where [ '   +  @fldName  +   ' ] '   +  @strTmp  +   ' ([ ' +  @fldName  +   ' ]) from (select top  '   +  str((@PageIndex - 1 ) * @PageSize)  +   '  [ ' +  @fldName  +   ' ] from [ '   +  @tblName  +   ' ] '   +  @strOrder  +   ' ) as tblTmp) ' +  @strOrder
   
if  @strWhere  !=   ''
      
set  @strSQL  =   ' select top  '   +  str(@PageSize)  + '   ' + @strGetFields +   '   from [ '
          
+  @tblName  +   ' ] where [ '   +  @fldName  +   ' ] '   +  @strTmp  +   ' ([ '
          
+  @fldName  +   ' ]) from (select top  '   +  str((@PageIndex - 1 ) * @PageSize)  +   '  [ '
          
+  @fldName  +   ' ] from [ '   +  @tblName  +   ' ] where  '   +  @strWhere  +   '   '
          
+  @strOrder  +   ' ) as tblTmp) and  '   +  @strWhere  +   '   '   +  @strOrder
  end 
 end   
 exec (@strSQL)
 
set  nocount off 
 
 

你可能感兴趣的:(procedure)