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 (11) 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 
 
 
posted @ 2007-07-25 14:36  hq5460  阅读(161)  评论(0编辑  收藏  举报