分页SQLServer存储过程,第1张

分页SQLServer存储过程,第2张

/*-由存储过程实现的分页程序

x页显示指定的表,查看和查询结果
对于表中主键或标识列的情况,直接从原表中查询;对于其他情况,请使用临时表方法
如果视图或查询结果中有主键,则不建议使用此方法。

-邹健,2003年9月-*/

/*-调用示例
exec p_show '区域数据'

Exec p_show '区域信息',5,3,'区域号码,区域名称,助记码','区域号码'
-*/

/*
由于通用性,对带排序的查询语句有一定的要求。如果你先排序,那么就会得到结果。那就是:

Exec _ show '按地区名从地区数据中选择前100% * ',5,3,'地区号,地区名,助记码','地区名'

-add:top 100 percent//top
*/
如果存在(select * from dbo.sysobjects其中id = object _ id (n' [dbo])。[p _ show]')和对象属性(id,n ' is procedure ')= 1)
drop procedure[dbo]。[p _ show]
开始

create p _ show
@ querystrnvarcar(4000),-表名,视图名,查询语句
@ pagesizeint = 10,-每页大小(行数)
@pagecurrent int=1,-要显示的页面
@ fdshownvarchar (4000) = ' ',-要显示的字段列表。如果查询结果有标识字段,则需要指定该值,并且不包含标识字段
@ fdordernvaarchar(1000)=“”-排序字段列表
as
declare @ fdnamenvaarchar(250)-表中的主键或表或临时表中的标识列名
,@ id1 @ id 2 archar(20)-开始和结束记录号
,@ obj _ id int-object id[/id

select @ obj _ id = object _ id(@ query str)
,@fdshow=case isnull(@fdshow,' ')when ' ' then ' * ' else ' '+@ FD show end
,@fdorder=case isnull(@fdorder,' ')when ' ' then ' ' else ' order by '+@ FD order end
,@querystr=case when @obj_id不为null then ' '+@ query str else '('+@ query str+')a ' end

-如果显示第一页,您可以使用top直接完成它
If @ pagecurrent = 1
begin
select @ id1 = cast(@ pagesize as varchar(20))
exec(' select top '+@ id1+@

-如果是表,则检查是否存在标识或主键
,如果@ obj _ id不为null且objectproperty (@ obj _ id,' I table ')= 1
begin
select @ id1 = cast(@ pagesize as varchar(20))
,@ id2 = cast((@ pagecurrent-1)* @ pagesize as varchar(20))

select @ FD name = name from sys columns where id = @ obj _ id and status = 0x 80
if @ @ rowcount = 0-如果表中没有identity列,则检查是否有主键
begin
如果不存在(select 1 from sys objects where parent _ obj = @ obj _ id and xtype = ' PK ')in table
gotolusetemp-如果表中没有主键,则将其视为临时表。

select @ FD name = name from sys columns where id = @ obj _ id and colid in(
select colid from sysindexkeys where @ obj _ id = id and indid in(
select indid from sysindexes where @ obj _ id = id and name in(
select name from sysobjects where xtype = ' PK ' and parent _ obj = @ obj _ id
)))
If @ @ rowcount > 1-检查清单中的主键是否为复合主键 @strwhere=@strwhere+'和b .['+name+']is null '
from sys columns where id = @ obj _ id和colid in(
select colid from sysindexkeys where @ obj _ id = id和indid in(
select indid from sysindexes where @ obj _ id = id和name in(
select name from sys objects where xtype = ' PK '和parent _ obj = @ obj _ id
))))))[/br

/*-使用标识列或主键为单个字段的处理方法-*/
lbuse identity:
exec(' select top '+@ id1+@ FD show+' from '+@ query str
+' where '+@ FD name+' not in(select top '
+@ id2+' '+@ FD name+' from '+@ query str+@ FD order
+')'+@ FD order
))

/*-表中复合主键的处理方法-*/
lbusepk:
exec(' select '+@ FD show+' from(select top '+@ id1+' a . * from
(select top 100% * from '+@ query str+@ FD order+')a
left join(select top '+@ id2+' '+@ strfd+'
from '+@ query str+@ FD order+')b

/*-临时表处理方法-*/
lbuse temp:
select @ fdname = '[id _ '+cast(newid()asvarchar(40))+']'
,@ id1 = cast(@ pagesize * @ pagecurrent-1)as varchar(20))
,@ id2 = cast(@ pagesize * @ pagecurrent-1 as varchar(20))

exec(' select '+@ FD name+' = identity(int,0,1),'+@ FD show+'
into # TB from '+@ query str+@ FD order+'
select '+@ FD show+' from # TB where '+@ FD name+' between '
+@ id1+' and '+@ id2
)

去吧

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 分页SQLServer存储过程

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情