职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 1112|回复: 1

分页存储过程(通过添加标识列实现此功能的)

[复制链接]
要狠 发表于 2009-4-28 21:21 | 显示全部楼层 |阅读模式
表名ffice
列名:employeeid 主键,name,birthday,sex,address.....

查询 第4页  5行  (先理解此select语句)
select top 5 * from office where employeeid>(select max(employeeid) from(select top 15 * from office order by employeeid)as tab)
请理解:假设查询 第4页  5行 ;那么从什么开始,到什么结束能  从(5*(4-1)+1)开始 从(4*5)结束
创建存储过程  (注:[]意思是可省略)

create proc[edure]  paging
as
with temp as  ----创建一张临时表
(select *,row_number() over(order by employeeid asc)) as en
from office where 1=1)   ------row_number() over(order by employeeid asc))as en   意思是创建标识列,并且起了一个别名en
select * from temp where en between 1 and 10  ---从临时表中查询标识列在1到10的数据
go ---批处理

我想你一定会说这个代码怎么是死的呢,要是我换了数据库不是不能用了吗!下面我们就创建一个灵活的分页存储过程!依据上面的基本代码
create proc[edure] paging
@PageIndex int =1,---第几页  (等号后面的是默认值,无等号的在调用存储过程是一定要赋值)
@PageSize int =10,---显示几行
@tablename varchar(20),   ---数据库表名
@strGetFields varchar(1000)=\'*\',  ----需要查询的列名
@fldName varchar(255), ----排序的列名
@ordertype varchar(10)=\'asc\',  ---排序类型(不是升序(asc)就是降序(desc))
@strWhere varchar(100)=\'\'  ---where条件 此处where条件设为空值
as
derclare @str varchar(2000)  ---重点:此处声明了一个字符串变量!用来存储下面的T--sql 语句
set @str=\'with temp as
(select  \'+@strGetFields+\',row_number(order by \'+@fldName+\' \'+@ordertype+\' ) as en from \'+@tablename+\' where 1=1 \'+@strwhere+\'  )
select * from temp where en between \'+str(@PageSize*(@PageIndex-1)+1)+\' and \'+str(@PageSize*@PageIndex)
exec sp_executesql @str   ---此处是调用系统存储过程  执行字符串@str中的语句
print @str  --打印T--sql语句
go

注:此代码是本人亲自敲打的,因本人技术欠佳,,有错误的地方 请见谅!!!!!
Edwin 发表于 2009-5-27 18:12 | 显示全部楼层
不错,收藏~
谢谢分享
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-5-6 20:37 , Processed in 0.126845 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表