高效的分页存储过程和调用代码

一、存储过程

 

ALTER   PROCEDURE   [ dbo ] . [ GetPagedData1 ]
(
@Tables   varchar ( 1000 ),
@PK   varchar ( 100 ),
@Sort   varchar ( 200 =   NULL ,
@PageNumber   int   =   1 ,
@PageSize   int   =   10 ,
@Fields   varchar ( 1000 =   ' * ' ,
@Filter   varchar ( 1000 =   NULL ,
@Group   varchar ( 1000 =   NULL )
AS

/**/ /*Default Sorting*/
IF   @Sort   IS   NULL   OR   @Sort   =   ''
 
SET   @Sort   =   @PK

/**/ /*Find the @PK type*/
DECLARE   @SortTable   varchar ( 100 )
DECLARE   @SortName   varchar ( 100 )
DECLARE   @strSortColumn   varchar ( 200 )
DECLARE   @operator   char ( 2 )
DECLARE   @type   varchar ( 100 )
DECLARE   @prec   int

/**/ /*Set sorting variables.*/  
IF   CHARINDEX ( ' DESC ' , @Sort ) > 0
 
BEGIN
  
SET   @strSortColumn   =   REPLACE ( @Sort ' DESC ' '' )
  
SET   @operator   =   ' <= '
 
END
ELSE
 
BEGIN
  
IF   CHARINDEX ( ' ASC ' @Sort =   0
   
SET   @strSortColumn   =   REPLACE ( @Sort ' ASC ' '' )
  
SET   @operator   =   ' >= '
 
END


IF   CHARINDEX ( ' . ' @strSortColumn >   0
 
BEGIN
  
SET   @SortTable   =   SUBSTRING ( @strSortColumn 0 CHARINDEX ( ' . ' , @strSortColumn ))
  
SET   @SortName   =   SUBSTRING ( @strSortColumn CHARINDEX ( ' . ' , @strSortColumn +   1
LEN ( @strSortColumn ))
 
END
ELSE
 
BEGIN
  
SET   @SortTable   =   @Tables
  
SET   @SortName   =   @strSortColumn
 
END

SELECT   @type = t.name,  @prec = c.prec
FROM  sysobjects o 
JOIN  syscolumns c  on  o.id = c.id
JOIN  systypes t  on  c.xusertype = t.xusertype
WHERE  o.name  =   @SortTable   AND  c.name  =   @SortName

IF   CHARINDEX ( ' char ' @type >   0
   
SET   @type   =   @type   +   ' ( '   +   CAST ( @prec   AS   varchar +   ' ) '


DECLARE   @strFilter   varchar ( 1000 )
DECLARE   @strSimpleFilter   varchar ( 1000 )
DECLARE   @strGroup   varchar ( 1000 )
DECLARE   @strStartRow   varchar ( 50 )
DECLARE   @StrEndRow   varchar ( 50 )

/**/ /*Default Page Number*/
IF   @PageNumber   <   1
 
SET   @PageNumber   =   1

/**/ /*Set paging variables.*/

SET   @strStartRow   = cast ((( @PageNumber   -   1 ) * @PageSize   +   1 as   varchar ( 50 )) 
SET   @StrEndRow = cast (( @strStartRow + @PageSize - 1 as   varchar ( 50 ))

/**/ /*Set filter & group variables.*/
IF   @Filter   IS   NOT   NULL   AND   @Filter   !=   ''
 
BEGIN
  
SET   @strFilter   =   '  WHERE  '   +   @Filter   +   '   '
  
SET   @strSimpleFilter   =   '  AND  '   +   @Filter   +   '   '

print ( @strFilter )
print ( @strSimpleFilter )
 
END
ELSE
 
BEGIN
  
SET   @strSimpleFilter   =   ''
  
SET   @strFilter   =   ''
 
END
IF   @Group   IS   NOT   NULL   AND   @Group   !=   ''
 
SET   @strGroup   =   '  GROUP BY  '   +   @Group   +   '   '
ELSE
 
SET   @strGroup   =   ''
 
/**/ /*Execute dynamic query*/  
-- Exec(
--
'
--
DECLARE @SortColumn ' + @type + '
--
SET ROWCOUNT ' + @strStartRow + '
--
SELECT @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' +
--
@strGroup + ' ORDER BY ' + @Sort + '
--
SET ROWCOUNT ' + @strPageSize + '
--
SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator +
--
' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
--
'
--
)
Exec ( '
with TGetPagedData as
 ( 
  select 
' + @Fields + ' ,ROW_NUMBER() over( order by  ' + @Sort + ' ) as RowNumber from  ' + @Tables + @strFilter + '  
 )
select * from TGetPagedData where RowNumber between 
' + @strStartRow + '  and  ' + @StrEndRow + '
' )

EXEC ( ' select count(*) from  ' +   @Tables +   @strFilter )

print  ( '
with TGetPagedData as
 ( 
  select 
' + @Fields + ' ,ROW_NUMBER() over( order by  ' + @Sort + ' ) as RowNumber from  ' + @Tables + @strFilter + '  
 )
select * from TGetPagedData where RowNumber between 
' + @strStartRow + '  and  ' + @StrEndRow + '
' )

print  ( ' select count(*) from  ' +   @Tables +   @strFilter )


二、调用代码

  public   static  DataTable GetPagedData( string  tableName,  string  primaryKey,  string  sortExpress,  int  currentPage,  int  pageSize,  string  fields,  string  filter,  string  groupBy,  out   int  totalCount)
        
{
            
try
            
{
                
string sql = "GetPagedData1";
                SqlDBAccess access 
= new SqlDBAccess();
                DataSet result;
                SqlParameter[] sqlparam 
= 
            
{
                 
new SqlParameter("@Tables",SqlDbType.VarChar),
                
new SqlParameter("@PK",SqlDbType.VarChar),
                
new SqlParameter("@Sort",SqlDbType.VarChar),
                
new SqlParameter("@PageNumber",SqlDbType.Int),
                
new SqlParameter("@PageSize",SqlDbType.Int),
                
new SqlParameter("@Fields",SqlDbType.VarChar),
                
new SqlParameter("@Filter",SqlDbType.VarChar),
                
new SqlParameter("@Group",SqlDbType.VarChar),
               
            }
;



                
int i = 0;
                sqlparam[i
++].Value = tableName;
                sqlparam[i
++].Value = primaryKey;
                sqlparam[i
++].Value = sortExpress;
                sqlparam[i
++].Value = currentPage;
                sqlparam[i
++].Value = pageSize;
                sqlparam[i
++].Value = fields;
                sqlparam[i
++].Value = filter;
                sqlparam[i
++].Value = groupBy;


                result 
= access.ExecuteDataset("TelecomAH163", CommandType.StoredProcedure, sql, sqlparam);
                totalCount 
= (int)result.Tables[1].Rows[0][0];
                
return result.Tables[0];
            }

            
catch (Exception e)
            
{
                Tracing.Error(
"", e);
                totalCount 
= 0;
                
return null;
            }

        }

转载于:https://www.cnblogs.com/lt2699/archive/2008/03/28/1127860.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值