针对sql 2005优化的高性能分页存储过程

存储过程代码如下:
None.gif ALTER   PROCEDURE   [ dbo ] . [ Pg_Paging ]
None.gif
@Tables   varchar ( 1000 ),  -- 表名,多红表是请使用 tA a inner join tB b On a.AID = b.AID
None.gif
@PK   varchar ( 100 ),     -- 主键,可以带表头 a.AID
None.gif
@Sort   varchar ( 200 =   '' -- 排序字段
None.gif
@PageNumber   int   =   1 ,     -- 开始页码
None.gif
@PageSize   int   =   10 ,         -- 页大小
None.gif
@Fields   varchar ( 1000 =   ' * ' , -- 读取字段
None.gif
@Filter   varchar ( 1000 =   NULL , -- Where条件
None.gif
@Group   varchar ( 1000 =   NULL ,   -- 分组
None.gif
@isCount   bit   =   0       -- 1    --是否获得总记录数
None.gif
AS
None.gif
--
None.gif--
select * from GL_NEWS order by GN_UPDATE_DATE DESC
None.gif--
exec Pg_Paging @Tables = 'tb_NewsInfo', @PK = 'News_ID', @Sort = 'News_ID DESC', @PageNumber = 2, @PageSize = 15,@Fields = '*', @Group = '', @isCount = 0
None.gif
DECLARE   @strFilter   varchar ( 2000 )
None.gif
declare   @sql   varchar ( 8000 )
None.gif
IF   @Filter   IS   NOT   NULL   AND   @Filter   !=   ''
None.gif  
BEGIN
None.gif   
SET   @strFilter   =   '  WHERE  '   +   @Filter   +   '   '
None.gif  
END
None.gif
ELSE
None.gif  
BEGIN
None.gif   
SET   @strFilter   =   ''
None.gif  
END
None.gif
None.gif
if   @isCount   =   1   -- 只获得记录条数
None.gif
     begin
None.gif        
set   @sql   =   ' SELECT  Count(*) FROM  '   +   @Tables   +   @strFilter   
None.gif    
end
None.gif
else
None.gif
begin
None.gif
if   @Sort   =   ''
None.gif  
set   @Sort   =   @PK   +   '  DESC  '
None.gif
None.gif
IF   @PageNumber   <   1
None.gif  
SET   @PageNumber   =   1
None.gif
None.gif
if   @PageNumber   =   1   -- 第一页提高性能
None.gif
begin  
None.gif  
set   @sql   =   ' select top  '   +   str ( @PageSize + '   ' + @Fields +   '   from  '   +   @Tables   +   '   '   +   @strFilter   +   '  ORDER BY   ' +   @Sort
None.gif
end  
None.gif
else
None.gif  
begin
ExpandedBlockStart.gifContractedBlock.gif  
/**/ /**/ /**/ /*Execute dynamic query*/     
None.gif   
DECLARE   @START_ID   varchar ( 50 )
None.gif
DECLARE   @END_ID   varchar ( 50 )
None.gif
SET   @START_ID   =   convert ( varchar ( 50 ),( @PageNumber   -   1 *   @PageSize   +   1 )
None.gif
SET   @END_ID   =   convert ( varchar ( 50 ), @PageNumber   *   @PageSize )
None.gif    
set   @sql   =    '  SELECT  ' + @Fields +   '
None.gif   FROM (SELECT ROW_NUMBER() OVER(ORDER BY 
' + @Sort + ' ) AS rownum, 
None.gif     
' + @Fields +   '
None.gif      FROM 
' ' +@strFilter+ + @Tables +' ' ) AS D
None.gif   WHERE rownum BETWEEN 
' + @START_ID + '  AND  '   + @END_ID   + '  ORDER BY  ' + @Sort
None.gif  
END
None.gif
None.gif
END
None.gif
-- print @sql
None.gif

None.gif
EXEC ( @sql )

可以通过封装一个静态函数来执行:( EnterpriseLibrary3。1)

None.gif using System;
None.gifusing System.Data;
None.gifusing System.Data.Common;
None.gifusing System.Globalization;
None.gifusing System.Xml;
None.gifusing Microsoft.Practices.EnterpriseLibrary.Data;
None.gifusing Microsoft.Practices.EnterpriseLibrary.Data.Sql;
None.gifnamespace Glenet.EjiaShop.SqlData
None.gif{
None.gif    
///   < summary >
None.gif    
///   Pageing
None.gif    
///   </ summary >
None.gif    
public  class Pageing
None.gif    {
None.gif        
public  Pageing()
None.gif        {
None.gif            
//
None.gif            
//  TODO: 在此处添加构造函数逻辑
None.gif            
//
None.gif        }
None.gif
None.gif        #region Pg_Paging
None.gif        
///   < summary >
None.gif        
///  Pg_Paging
None.gif        
///   </ summary >
None.gif        
///   < param name = "Tables" ></ param >
None.gif        
///   < param name = "PK" ></ param >
None.gif        
///   < param name = "Filter" ></ param >
None.gif        
///   < returns ></ returns >
None.gif        
public  static  int  Pg_PageCount(string Tables,string PK,string Filter)
None.gif        {
None.gif            
// 创建数据库实例
None.gif            
Database  db  =  DatabaseFactory.CreateDatabase();
None.gif            
// 获得命令
None.gif            string sqlCommand 
=  "Pg_Paging";
None.gif            DbCommand dbCommand 
=  db.GetStoredProcCommand(sqlCommand);
None.gif            
// 设置参数
None.gif            db.AddInParameter(dbCommand, "Tables", DbType.String, Tables);
None.gif            db.AddInParameter(dbCommand, "PK", DbType.String, PK);
None.gif            db.AddInParameter(dbCommand, "Sort", DbType.String, "");
None.gif            db.AddInParameter(dbCommand, "PageNumber", DbType.
Double 0 );
None.gif            db.AddInParameter(dbCommand, "PageSize", DbType.
Double 0 );
None.gif            db.AddInParameter(dbCommand, "Fields", DbType.String, "
* ");
None.gif            db.AddInParameter(dbCommand, "Filter", DbType.String, Filter);
None.gif            db.AddInParameter(dbCommand, "
Group ", DbType.String, "");
None.gif            db.AddInParameter(dbCommand, "isCount", DbType.Boolean, 
1 );
None.gif
None.gif            
// 执行
None.gif            
return   int .Parse(db.ExecuteScalar(dbCommand).ToString());    
None.gif            
// 取得输出参数
None.gif
None.gif
None.gif        }
None.gif        #endregion
None.gif
None.gif        #region Pg_Paging
None.gif        
///   < summary >
None.gif        
///  Pg_Paging
None.gif        
///   </ summary >
None.gif        
///   < param name = "Tables" ></ param >
None.gif        
///   < param name = "PK" ></ param >
None.gif        
///   < param name = "Sort" ></ param >
None.gif        
///   < param name = "PageNumber" ></ param >
None.gif        
///   < param name = "PageSize" ></ param >
None.gif        
///   < param name = "Fields" ></ param >
None.gif        
///   < param name = "Filter" ></ param >
None.gif        
///   < param name = " Group " ></ param >
None.gif        
///   < returns ></ returns >
None.gif        
public  static DataSet Pg_Paging(string Tables,string PK,string Sort, int  PageNumber, int  PageSize,string Fields,string Filter,string  Group )
None.gif        {
None.gif            
// 创建数据库实例
None.gif            
Database  db  =  DatabaseFactory.CreateDatabase();
None.gif            
// 获得命令
None.gif            string sqlCommand 
=  "Pg_Paging";
None.gif            DbCommand dbCommand 
=  db.GetStoredProcCommand(sqlCommand);
None.gif            
// 设置参数            
None.gif            db.AddInParameter(dbCommand, "Tables", DbType.String, Tables);
None.gif            db.AddInParameter(dbCommand, "PK", DbType.String, PK);
None.gif            db.AddInParameter(dbCommand, "Sort", DbType.String, Sort);
None.gif            db.AddInParameter(dbCommand, "PageNumber", DbType.
Double , PageNumber);
None.gif            db.AddInParameter(dbCommand, "PageSize", DbType.
Double , PageSize);
None.gif            db.AddInParameter(dbCommand, "Fields", DbType.String, Fields);
None.gif            db.AddInParameter(dbCommand, "Filter", DbType.String, Filter);
None.gif            db.AddInParameter(dbCommand, "
Group ", DbType.String,  Group );
None.gif            db.AddInParameter(dbCommand, "isCount", DbType.Boolean, 
0 );
None.gif
None.gif            
// 执行
None.gif            
return  db.ExecuteDataSet(dbCommand);    
None.gif        }
None.gif        #endregion
None.gif
None.gif
None.gif    }
None.gif
None.gif}
None.gif
前台:调用如下:
None.gif string  filter  =   "   1 = 1  " ;
None.gif
None.gif        AspNetPager1.RecordCount 
=  Glenet.EjiaShop.SqlData.Pageing.Pg_PageCount( " tb_NewsInfo " " News_ID " , filter);
None.gif        
using  (DataSet ds  =  Glenet.EjiaShop.SqlData.Pageing.Pg_Paging( " tb_NewsInfo " " News_ID " " News_AddTime DESC " , AspNetPager1.CurrentPageIndex, AspNetPager1.PageSize,  " * " , filter,  "" ))
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
this.Re_ContentList.DataSource = ds.Tables[0].DefaultView;
InBlock.gif            
this.Re_ContentList.DataBind();
InBlock.gif
InBlock.gif            AspNetPager1.CustomInfoText 
= "记录总数:<font color=\"#00007f\"><b>" + AspNetPager1.RecordCount.ToString() + "</b></font>";
InBlock.gif            AspNetPager1.CustomInfoText 
+= " 总页数:<font color=\"#00007f\"><b>" + AspNetPager1.PageCount.ToString() + "</b></font>";
InBlock.gif            AspNetPager1.CustomInfoText 
+= " 当前页:<font color=\"red\"><b>" + AspNetPager1.CurrentPageIndex.ToString() + "</b></font>";
ExpandedBlockEnd.gif        }
相当方便。
文章来自:http://www.cnblogs.com/edobnet/archive/2008/01/23/1049985.html

转载于:https://www.cnblogs.com/xiao_haun/archive/2011/01/23/1942580.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值