,转asp.net分页存储过程

Asp.Net分页存储过程

SQL分页语句

一、比较万能的分页:

sql代码:

1

2

3

selecttop每页显示的记录数 *fromtopicwhereidnotin

(selecttop(当前的页数-1)×每页显示的记录数 idfromtopicorderbyiddesc)

orderbyiddesc

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

二、SQL2005中的分页代码:

sql代码:

1

2

3

4

5

6

--讲查询出来的结果集作为一张临时表

withtempTableas(

selectRow_Number() over (orderbyiddesc)asRowNum, *fromtableName

)

--从临时表中取得指定行号区间的行

SELECT*FROMtempTablewhereRowNumbetween@startIndexand@endIndex

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

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

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

SETANSI_NULLSON

GO

SETQUOTED_IDENTIFIERON

GO

------------------------------------

--用途:分页存储过程

--说明:

------------------------------------

CREATEPROCEDURE[dbo].[UP_GetRecordByPage]

@tblNamevarchar(255),-- 表名

@fldNamevarchar(255),-- 排序字段名

@PageSizeint= 10,-- 页尺寸

@PageIndexint= 1,-- 页码

@IsReCountbit= 0,-- 返回记录总数, 非 0 值则返回

@OrderTypebit= 0,-- 设置排序类型, 非 0 值则降序

@strWherevarchar(1000) ='1=1'-- 查询条件 (注意: 不要加 where)

AS

declare@beginint,@endint,@sqlvarchar(4000),@ordervarchar(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>

publicDataSet GetList(intpageSize,intpageIndex,stringstrWhere,boolisCount)

{

SqlParameter[] parameters = {

newSqlParameter("@tblName", SqlDbType.VarChar, 255),

newSqlParameter("@fldName", SqlDbType.VarChar, 255),

newSqlParameter("@pageSize", SqlDbType.Int),

newSqlParameter("@pageIndex", SqlDbType.Int),

newSqlParameter("@IsReCount", SqlDbType.Bit),

newSqlParameter("@OrderType", SqlDbType.Bit),

newSqlParameter("@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;

returnDbHelperSQL.RunProcedure("UP_GetRecordByPage",parameters,"ds");

}

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

SETANSI_NULLSON

GO

SETQUOTED_IDENTIFIERON

GO

-- =============================================

-- Author: 牛腩

-- Create date: 2009-07-22 12:41

-- Description: 分页,用到了ROW_NUMBER()

-- =============================================

ALTERPROCEDURE[dbo].[proc_ShowPage]

@tblNamevarchar(255),-- 表名,也可传入inner join内连接

@strGetFieldsvarchar(1000) ='*',-- 需要返回的列,默认*

@strOrdervarchar(255)='',-- 排序的字段名,必填

@strOrderTypevarchar(10)='ASC',-- 排序的方式,默认ASC

@PageSizeint= 10,-- 页尺寸,默认10

@PageIndexint= 1,-- 页码,默认1

@strWherevarchar(1500) =''-- 查询条件 (注意: 不要加 where)

AS

declare@strSQLvarchar(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语句

SQL分页语句

一、比较万能的分页:

sql代码:

1

2

3

selecttop每页显示的记录数 *fromtopicwhereidnotin

(selecttop(当前的页数-1)×每页显示的记录数 idfromtopicorderbyiddesc)

orderbyiddesc

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

二、SQL2005中的分页代码:

sql代码:

1

2

3

4

5

6

--讲查询出来的结果集作为一张临时表

withtempTableas(

selectRow_Number() over (orderbyiddesc)asRowNum, *fromtableName

)

--从临时表中取得指定行号区间的行

SELECT*FROMtempTablewhereRowNumbetween@startIndexand@endIndex

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

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

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

SETANSI_NULLSON

GO

SETQUOTED_IDENTIFIERON

GO

------------------------------------

--用途:分页存储过程

--说明:

------------------------------------

CREATEPROCEDURE[dbo].[UP_GetRecordByPage]

@tblNamevarchar(255),-- 表名

@fldNamevarchar(255),-- 排序字段名

@PageSizeint= 10,-- 页尺寸

@PageIndexint= 1,-- 页码

@IsReCountbit= 0,-- 返回记录总数, 非 0 值则返回

@OrderTypebit= 0,-- 设置排序类型, 非 0 值则降序

@strWherevarchar(1000) ='1=1'-- 查询条件 (注意: 不要加 where)

AS

declare@beginint,@endint,@sqlvarchar(4000),@ordervarchar(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>

publicDataSet GetList(intpageSize,intpageIndex,stringstrWhere,boolisCount)

{

SqlParameter[] parameters = {

newSqlParameter("@tblName", SqlDbType.VarChar, 255),

newSqlParameter("@fldName", SqlDbType.VarChar, 255),

newSqlParameter("@pageSize", SqlDbType.Int),

newSqlParameter("@pageIndex", SqlDbType.Int),

newSqlParameter("@IsReCount", SqlDbType.Bit),

newSqlParameter("@OrderType", SqlDbType.Bit),

newSqlParameter("@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;

returnDbHelperSQL.RunProcedure("UP_GetRecordByPage",parameters,"ds");

}

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

SETANSI_NULLSON

GO

SETQUOTED_IDENTIFIERON

GO

-- =============================================

-- Author: 牛腩

-- Create date: 2009-07-22 12:41

-- Description: 分页,用到了ROW_NUMBER()

-- =============================================

ALTERPROCEDURE[dbo].[proc_ShowPage]

@tblNamevarchar(255),-- 表名,也可传入inner join内连接

@strGetFieldsvarchar(1000) ='*',-- 需要返回的列,默认*

@strOrdervarchar(255)='',-- 排序的字段名,必填

@strOrderTypevarchar(10)='ASC',-- 排序的方式,默认ASC

@PageSizeint= 10,-- 页尺寸,默认10

@PageIndexint= 1,-- 页码,默认1

@strWherevarchar(1500) =''-- 查询条件 (注意: 不要加 where)

AS

declare@strSQLvarchar(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语句