加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

存储过程分页

发布时间:2020-12-12 15:29:28 所属栏目:MsSql教程 来源:网络整理
导读:?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
CREATE PROCEDURE PrcTest
-- 获得某一页的数据 --
@currPage int = 1,--当前页页码 (即Top currPage)
@showColumn varchar(2000) = '*',--需要得到的字段 (即 column1,column2,......)
@tabName varchar(2000),--需要查看的表名 (即 from table_name)
@strCondition varchar(2000) = '',--查询条件 (即 where condition......) 不用加where关键字
@ascColumn varchar(100) = '',--排序的字段名 (即 order by column asc/desc)
@bitOrderType bit = 0,---排序的类型 (0为升序,1为降序)
@pkColumn varchar(50) = '',--主键名称
@pageSize int = 20 --分页大小:每一页中的记录个数

AS
BEGIN -- 存储过程开始
-- 该存储过程需要用到的几个变量
DECLARE @strTemp varchar(1000)
DECLARE @strSql varchar(4000) --该存储过程最后执行的语句
DECLARE @strOrderType varchar(1000) --排序类型语句 (order by column asc或者order by column desc)

BEGIN
IF @bitOrderType = 1 -- bitOrderType=1即执行降序
BEGIN
SET @strOrderType = ' ORDER BY '+@ascColumn+' DESC'
SET @strTemp = '<(SELECT min'
END
ELSE
BEGIN
SET @strOrderType = ' ORDER BY '+@ascColumn+' ASC'
SET @strTemp = '>(SELECT max'
END

IF @currPage = 1 -- 如果是第一页
BEGIN
IF @strCondition != ''
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+
' WHERE '+@strCondition+@strOrderType
ELSE
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+@strOrderType
END

ELSE -- 其他页
BEGIN
IF @strCondition !=''
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+
' WHERE '+@strCondition+' AND '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currPage-1)*@pageSize)+
' '+@pkColumn+' FROM '+@tabName+@strOrderType+') AS TabTemp)'+@strOrderType
ELSE
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+
' WHERE '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currPage-1)*@pageSize)+' '+@pkColumn+
' FROM '+@tabName+@strOrderType+') AS TabTemp)'+@strOrderType
END

END
EXEC (@strSql)
END -- 存储过程结束

exec PrcTest 3,'*','pageTest','',6

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结果集!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

?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
-----------------两个分页存储过程的用法:

[Basic_Pagination2005]:只能在SQLServer2005下用;

?

[Basic_Pagination2000]:可在SQLServer2000和SQLServer2005下通用;

两个存储过程的参数是一样的,其中的参数说明在代码中已有注释。

需要注意的是当@IsReCount=1时,会返回记录总数。所以在.NET中需用DataSet存放记录集。

第一个Table是要查询的字段数据,第二个Table便是记录总数。

1.Basic_Pagination2000

    推荐文章
      热点阅读