当前位置: 首页  >  SqlServer  >  毫秒级百万数据分页存储过程

毫秒级百万数据分页存储过程 TOP

 
  1. /****** Object:  StoredProcedure [dbo].[up_Page2005]    Script Date: 11/28/2013 17:10:47 ******/   
  2. SET ANSI_NULLS ON  
  3. GO   
  4. SET QUOTED_IDENTIFIER ON  
  5. GO   
  6.   
  7. CREATE PROC [dbo].[up_Page2005]   
  8.     (   
  9.       @TableName VARCHAR(MAX) ,        --表名                   
  10.       @Fields VARCHAR(5000) = ''*'' ,    --字段名(全部字段为*)                   
  11.       @OrderField VARCHAR(5000) ,        --排序字段(必须!支持多字段)                   
  12.       @sqlWhere VARCHAR(5000) = NULL ,--条件语句(不用加where)                   
  13.       @pageSize INT ,                    --每页多少条记录                   
  14.       @pageIndex INT = 1             --指定当前为第几页               
  15.     )   
  16. AS    
  17.     BEGIN                   
  18.         DECLARE @sql NVARCHAR(MAX);                   
  19.         DECLARE @totalRecord INT;                   
  20.         DECLARE @TotalPage INT;                           
  21.                    
  22.     --计算总记录数                                 
  23.         IF ( @SqlWhere = ''''  
  24.              OR @sqlWhere = NULL  
  25.            )    
  26.             SET @sql = ''select @totalRecord = count(*) from '' + @TableName                   
  27.         ELSE    
  28.             SET @sql = ''select @totalRecord = count(*) from '' + @TableName   
  29.                 + '' where 1=1 '' + @sqlWhere                   
  30.                    
  31.         EXEC sp_executesql @sql, N''@totalRecord int OUTPUT'',   
  32.             @totalRecord OUTPUT--计算总记录数              
  33.                             
  34.     --计算总页数                   
  35.         SELECT  @TotalPage = CEILING(( @totalRecord + 0.0 ) / @PageSize)                   
  36.                    
  37.         IF ( @SqlWhere = ''''  
  38.              OR @sqlWhere = NULL  
  39.            )    
  40.             SET @sql = ''Select top ('' + CONVERT(VARCHAR, @pageSize) + '') ''  
  41.                 + @Fields + '' FROM (select ROW_NUMBER() Over(order by ''  
  42.                 + @OrderField + '') as 编号,'' + @Fields + '' from '' + @TableName                    
  43.         ELSE    
  44.             SET @sql = ''Select top ('' + CONVERT(VARCHAR, @pageSize) + '') ''  
  45.                 + @Fields + '' FROM (select ROW_NUMBER() Over(order by ''  
  46.                 + @OrderField + '') as 编号,'' + @Fields + '' from '' + @TableName   
  47.                 + '' where 1=1 '' + @SqlWhere                       
  48.                           
  49.                    
  50.     --处理页数超出范围情况                   
  51.         IF @PageIndex <= 0    
  52.             SET @pageIndex = 1                   
  53.                        
  54.         IF @pageIndex > @TotalPage    
  55.             SET @pageIndex = @TotalPage                   
  56.                    
  57.      --处理开始点和结束点                   
  58.         DECLARE @StartRecord INT                   
  59.         DECLARE @EndRecord INT                   
  60.                        
  61.         SET @StartRecord = ( @pageIndex - 1 ) * @PageSize + 1                   
  62.         SET @EndRecord = @StartRecord + @pageSize - 1                   
  63.                    
  64.     --继续合成sql语句                   
  65.         SET @Sql = @Sql + '') as t where 编号>='' + CONVERT(VARCHAR, @StartRecord)   
  66.             + '' order by 编号''          
  67.         EXEC(@Sql)                       
  68.         IF @@Error <> 0    
  69.             RETURN -1                     
  70.         ELSE    
  71.             SELECT  @totalRecord ,   
  72.                     @TotalPage ---返回记录总数,返回总页数                      
  73.     END  

 

Views:1064   Posted at:2013-11-28
收藏 推荐 打印 | 录入:Admin | 阅读:0