Asp.Net分页存储过程

 

SQL分页语句

一、比较万能的分页:

sql代码:

1
2
3
select top 每页显示的记录数 * from topic where id not in
  ( select top (当前的页数-1)×每页显示的记录数 id from topic order by id desc )
  order by id desc


需要注意的是在access中不能是top 0,所以如果数据只有一页的话就得做判断了。。

二、SQL2005中的分页代码:

sql代码:

1
2
3
4
5
6
--讲查询出来的结果集作为一张临时表
with tempTable as (
   select Row_Number() over ( order by id desc ) as RowNum, * from tableName
)
--从临时表中取得指定行号区间的行
SELECT * FROM tempTable where RowNum between @startIndex and @endIndex


注:ROW_NUMBER() OVER (ORDER BY id desc)为SQL2005新增函数,表示取出每一列的行号

三、分页存储过程SQL代码: 

1、第一种UP_GetRecordByPage,包含计算总条数(推荐

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 
 
------------------------------------
--用途:分页存储过程 
--说明:
------------------------------------
 
CREATE  PROCEDURE [dbo].[UP_GetRecordByPage]
     @tblName      varchar (255),       -- 表名
     @fldName    varchar (255),       -- 排序字段名
     @PageSize     int = 10,           -- 页尺寸
     @PageIndex    int = 1,            -- 页码
     @IsReCount    bit = 0,            -- 返回记录总数, 非 0 值则返回
     @OrderType    bit = 0,            -- 设置排序类型, 非 0 值则降序
     @strWhere     varchar (1000) = '1=1'  -- 查询条件 (注意: 不要加 where)
AS
 
declare @ begin int ,@ end int ,@sql varchar (4000),@ order varchar (5)
 
set @ begin =@PageSize* (@PageIndex-1) +1
set @ end =@ begin +@PageSize-1
set @ order = ''
if(@OrderType=1)
     set @ order = ' desc'
 
set @sql= '
select * from
(
select 
ROW_NUMBER() over(order by ' + @fldName + @ order + ' ) as od,
*
from ' +@tblName + '
  where ' + @strWhere +
') as tbl
where od between ' + rtrim(ltrim(str(@ begin )))+ ' and ' + rtrim(ltrim(str(@ end )))
 
exec (@sql)
if(@IsReCount=1)
     exec ( 'select count(*) from ' + @tblName+ ' where ' +@strWhere)

用法:

/// <summary>
         /// 分页获取数据列表
         /// </summary>
         public DataSet GetList( int pageSize, int pageIndex, string strWhere, bool isCount)
         {
             SqlParameter[] parameters = {
                     new SqlParameter( "@tblName" , SqlDbType.VarChar, 255),
                     new SqlParameter( "@fldName" , SqlDbType.VarChar, 255),
                     new SqlParameter( "@pageSize" , SqlDbType.Int),
                     new SqlParameter( "@pageIndex" , SqlDbType.Int),
                     new SqlParameter( "@IsReCount" , SqlDbType.Bit),
                     new SqlParameter( "@OrderType" , SqlDbType.Bit),
                     new SqlParameter( "@strWhere" , SqlDbType.VarChar,1000),
                     };
             parameters[0].Value = "Whir_MemberDownRuleValue" ;
             parameters[1].Value = "MemberLever" ;
             parameters[2].Value = pageSize;
             parameters[3].Value = pageIndex;
             if (isCount){
                 parameters[4].Value = 1;
             }
             else {
                 parameters[4].Value = 0;
             }
             parameters[5].Value = 0;
             parameters[6].Value = strWhere;
             return DbHelperSQL.RunProcedure( "UP_GetRecordByPage" ,parameters, "ds" );
         }

2、sql代码:(不带计算总条数)

 

 
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      牛腩
-- Create date: 2009-07-22 12:41
-- Description: 分页,用到了ROW_NUMBER()
-- =============================================
ALTER PROCEDURE [dbo].[proc_ShowPage]
@tblName   varchar (255),       -- 表名,也可传入inner join内连接
@strGetFields varchar (1000) = '*' , -- 需要返回的列,默认*
@strOrder varchar (255)= '' ,      -- 排序的字段名,必填
@strOrderType varchar (10)= 'ASC' , -- 排序的方式,默认ASC
@PageSize   int = 10,          -- 页尺寸,默认10
@PageIndex int = 1,           -- 页码,默认1
@strWhere varchar (1500) = '' -- 查询条件 (注意: 不要加 where)
AS
 
declare @strSQL   varchar (5000)
 
if @strWhere != ''
set @strWhere= ' where ' +@strWhere
 
set @strSQL=
'SELECT * FROM (' +
     'SELECT ROW_NUMBER() OVER (ORDER BY ' +@strOrder+ ' ' +@strOrderType+ ') AS pos,' +@strGetFields+ ' ' +
     'FROM [' +@tblName+ '] ' +@strWhere+
') AS sp WHERE pos BETWEEN ' +str((@PageIndex-1)*@PageSize+1)+ ' AND ' +str(@PageIndex*@PageSize)
 
exec (@strSQL)
print @strSQL  -- 测试用,可在查询的时候看到生成的SQL语句

转载于:https://www.cnblogs.com/BoYu045535/p/3966763.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值