一个分页存储过程
时间:2008-11-11 来源:hkebao
use TestDB
if exists(select * from sysobjects where name = 'proc_getinfo')
drop procedure proc_getinfo
go
--创建存储过程
create procedure proc_getinfo
@tablename varchar(25), --所要查询的表名
@num varchar(30), --按列进行排序
@rowspage int, --每页的行数
@perpage int --当前页
as
--根据不同的参数,动态组合 SQL 语句
declare @sqlse nvarchar(150),@backpage int
--获得上一页的页数
set @backpage = @perpage - 1
--结合该
set @sqlse = N'select top '+ convert(varchar(25),@rowspage) + ' * from '+
@tablename + ' where id not in (select top '+ convert(varchar(25),@rowspage*@backpage) +' id from '+
@tablename +' order by '+ @num +' ) order by ' + @num
--执行该 SQL 语句
exec sp_executesql @sqlse
go
这样的话执行的命令如下:
use TestDB
--参数解释: 1,topic参数是要进行分页的表 2,根据id这个列进行排序 3,5是每页显示的条数 4,1是表示调用第1页
exec proc_getinfo 'pageTest','id',5,2
go
-----------------两个分页存储过程的用法:
--OK现在来看看我们的JSP页面中如何 来调用这个存储过程吧:
我们写的是用是JAVABEAN+JSP来实现的
这个JAVA来封装的代码如下:
public ResultSet returnRs(String tblName,String colu,int pageCount,int whichPage) {
ResultSet rs = null;
String strSQL;
Connection conn = db.getConn();
Statement state ;
strSQL = "{call proc_getinfo('"+tblName+"','"+colu+"',"+pageCount+","+whichPage+")}";
java.sql.CallableStatement sqlStmt ; //可调用语句对象
try {
state = conn.createStatement();
rs = state.executeQuery(strSQL);
} catch (SQLException e) {
System.out.println("Num1");
}
return rs;
}
在JSP中只需要通过传入的ID值进行比较就可以了。来实现分页处理的效果了!
返回的是一个RS结果集!
if exists(select * from sysobjects where name = 'proc_getinfo')
drop procedure proc_getinfo
go
--创建存储过程
create procedure proc_getinfo
@tablename varchar(25), --所要查询的表名
@num varchar(30), --按列进行排序
@rowspage int, --每页的行数
@perpage int --当前页
as
--根据不同的参数,动态组合 SQL 语句
declare @sqlse nvarchar(150),@backpage int
--获得上一页的页数
set @backpage = @perpage - 1
--结合该
set @sqlse = N'select top '+ convert(varchar(25),@rowspage) + ' * from '+
@tablename + ' where id not in (select top '+ convert(varchar(25),@rowspage*@backpage) +' id from '+
@tablename +' order by '+ @num +' ) order by ' + @num
--执行该 SQL 语句
exec sp_executesql @sqlse
go
这样的话执行的命令如下:
use TestDB
--参数解释: 1,topic参数是要进行分页的表 2,根据id这个列进行排序 3,5是每页显示的条数 4,1是表示调用第1页
exec proc_getinfo 'pageTest','id',5,2
go
-----------------两个分页存储过程的用法:
[Basic_Pagination2005]:只能在SQLServer2005下用;
[Basic_Pagination2000]:可在SQLServer2000和SQLServer2005下通用;
两个存储过程的参数是一样的,其中的参数说明在代码中已有注释。
需要注意的是当@IsReCount=1时,会返回记录总数。所以在.NET中需用DataSet存放记录集。
第一个Table是要查询的字段数据,第二个Table便是记录总数。
1.Basic_Pagination2000
CREATE PROCEDURE PrcTest |
2.Basic_Pagination2005
ALTER PROCEDURE [dbo].[Basic_Pagination2005]
@tblName nvarchar(200), --表名
@fidlelist nvarchar(1000), --要查询字段
@fldName nvarchar(100), --排序字段
@PageSize int, --页尺寸
@PageIndex int, --页码
@IsReCount bit , -- 返回记录总数, 非 0 值则返回
@OrderType bit, -- 设置排序类型, 非 0 值则降序
@strWhere nvarchar(1000) --查询条件
AS
declare @sqlstr nvarchar(4000),
@tmpwhere nvarchar(4000),@tmporder nvarchar(100)
BEGIN
if @OrderType != 0
begin
set @tmporder = @fldName +'' desc ''
end
else
begin
set @tmporder = @fldName +'' asc ''
end
set @tmpwhere='''';
if(@strWhere!='''')
begin
set @tmpwhere='' where ''+@strWhere;
end
set @sqlstr=N''select * from
(select ''+@fidlelist+'', ROW_NUMBER() OVER(order
by ''+@tmporder+'') as row from ''+@tblName+@tmpwhere+'')
tmp where row between ''+cast
(((@PageIndex-1)*@PageSize+1) as nvarchar)+'' and ''+cast
(@PageIndex*@PageSize as nvarchar);
exec sp_executesql @sqlstr
if @IsReCount != 0
begin
set @sqlstr=N''select count(*) as Total from ''+ @tblName+@tmpwhere
exec sp_executesql @sqlstr
end
END
--OK现在来看看我们的JSP页面中如何 来调用这个存储过程吧:
我们写的是用是JAVABEAN+JSP来实现的
这个JAVA来封装的代码如下:
public ResultSet returnRs(String tblName,String colu,int pageCount,int whichPage) {
ResultSet rs = null;
String strSQL;
Connection conn = db.getConn();
Statement state ;
strSQL = "{call proc_getinfo('"+tblName+"','"+colu+"',"+pageCount+","+whichPage+")}";
java.sql.CallableStatement sqlStmt ; //可调用语句对象
try {
state = conn.createStatement();
rs = state.executeQuery(strSQL);
} catch (SQLException e) {
System.out.println("Num1");
}
return rs;
}
在JSP中只需要通过传入的ID值进行比较就可以了。来实现分页处理的效果了!
返回的是一个RS结果集!
相关阅读 更多 +