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

分页 SQLServer存储过程

发布时间:2020-12-12 14:25:14 所属栏目:MsSql教程 来源:网络整理
导读:/*--用存储过程实现的分页程序 ? 显示指定表、视图、查询结果的第X页 ? 对于表中主键或标识列的情况,直接从原表取数查询,其它情况使用临时表的方法 ? 如果视图或查询结果中有主键,不推荐此方法 ? --邹建 2003.09--exec p_show '地区资料' ? exec p_show '地

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

?

显示指定表、视图、查询结果的第X页

?

对于表中主键或标识列的情况,直接从原表取数查询,其它情况使用临时表的方法

?

如果视图或查询结果中有主键,不推荐此方法

?

--邹建 2003.09--exec p_show '地区资料'

?

exec p_show '地区资料',5,3,'地区编号,地区名称,助记码','地区编号'

?

--因为要顾及通用性,所以对带排序的查询语句有一定要求.如果先排序,再出结果.就是:

?

exec p_show 'select top 100 percent * from 地区资料 order by 地区名称','地区名称'

?

--查询语句加上:top 100 percent //top时

?

if exists? and OBJECTPROPERTY = 1)

?

drop procedure .

?

GO

?

CREATE Proc p_show

?

@QueryStr nvarchar,--表名、视图名、查询语句

?

@PageSize int=10,--每页的大小

?

@PageCurrent int=1,--要显示的页

?

@FdShow nvarchar ='',--要显示的字段列表,如果查询结果有标识字段,需要指定此值,且不包含标识字段

?

@FdOrder nvarchar ='' --排序字段列表

?

as

?

declare @FdName nvarchar --表中的主键或表、临时表中的标识列名

?

,@Id1 varchar,@Id2 varchar --开始和结束的记录号

?

,@Obj_ID int --对象ID

?

--表中有复合主键的处理

?

declare @strfd nvarchar --复合主键列表

?

,@strjoin nvarchar --连接字段

?

,@strwhere nvarchar --查询条件

?

select @Obj_ID=object_id

?

,@FdShow=case isnull when '' then ' *' else ' '+@FdShow end

?

,@FdOrder=case isnull when '' then '' else ' order by '+@FdOrder end

?

,@QueryStr=case when @Obj_ID is not null then ' '+@QueryStr else '? a' end

?

--如果显示第一页,可以直接用top来完成

?

if @PageCurrent=1

?

begin

?

select @Id1=cast)

?

exec

?

return

?

end

?

--如果是表,则检查表中是否有标识更或主键

?

if @Obj_ID is not null and objectproperty=1

?

begin

?

select @Id1=cast)

?

,@Id2=cast*@PageSize as varchar)

?

select @FdName=name from syscolumns where id=@Obj_ID and status=0x80

?

if @@rowcount=0 --如果表中无标识列,则检查表中是否有主键

?

begin

?

if not exists

?

goto lbusetemp --如果表中无主键,则用临时表处理

?

select @FdName=name from syscolumns where id=@Obj_ID and colid in))

?

if @@rowcount>1 --检查表中的主键是否为复合主键

?

begin

?

select @strfd='',@strjoin='',@strwhere=''

?

select @strfd=@strfd+','

?

,@strjoin=@strjoin+' and a.=b.'

?

,@strwhere=@strwhere+' and b. is null'

?

from syscolumns where id=@Obj_ID and colid in))

?

select @strfd=substring

?

,@strjoin=substring

?

,@strwhere=substring

?

goto lbusepk

?

end

?

end

?

end

?

else

?

goto lbusetemp

?

/*--使用标识列或主键为单一字段的处理方法--lbuseidentity:

?

exec'+@FdOrder

?

)

?

return

?

/*--表中有复合主键的处理方法--lbusepk:

?

exec a

?

left join? b on '+@strjoin+'

?

where '+@strwhere+') a'

?

)

?

return

?

/*--用临时表处理的方法--lbusetemp:

?

select @FdName=''

?

,@Id1=cast as varchar)

?

,@Id2=cast)

?

exec,'+@FdShow+'

?

into #tb from'+@QueryStr+@FdOrder+'

?

select '+@FdShow+' from #tb where '+@FdName+' between '

?

+@Id1+' and '+@Id2

?

)

?

GO

(编辑:李大同)

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

    推荐文章
      热点阅读