分页 SQLServer存储过程

2022-11-12 09:54:50
内容摘要
这篇文章主要为大家详细介绍了分页 SQLServer存储过程,具有一定的参考价值,可以用来参考一下。 对此感兴趣的朋友,看看idc笔记做的技术笔记!/*--用存储过程实现的分页程序显示
文章正文

这篇文章主要为大家详细介绍了分页 SQLServer存储过程,具有一定的参考价值,可以用来参考一下。

对此感兴趣的朋友,看看idc笔记做的技术笔记!

/*--用存储过程实现的分页程序显示指定表、视图、查询结果的第X页对于表中主键或标识列的情况,直接从原表取数查询,其它情况使用临时表的方法如果视图或查询结果中有主键,不推荐此方法--邹建2003.09--*//*--调用示例execp_show'地区资料'execp_show'地区资料',5,3,'地区编号,地区名称,助记码','地区编号'--*//*因为要顾及通用性,所以对带排序的查询语句有一定要求.如果先排序,再出结果.就是:execp_show'selecttop100percent*from地区资料orderby地区名称',5,3,'地区编号,地区名称,助记码','地区名称'--查询语句加上:top100percent//top时*/ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[p_show]')andOBJECTPROPERTY(id,N'IsProcedure')=1)dropprocedure[dbo].[p_show]GOCreateProcp_show@QueryStrnvarchar(4000),--表名、视图名、查询语句@PageSizeint=10,--每页的大小(行数)@PageCurrentint=1,--要显示的页@FdShownvarchar(4000)='',--要显示的字段列表,如果查询结果有标识字段,需要指定此值,且不包含标识字段@FdOrdernvarchar(1000)=''--排序字段列表asdeclare@FdNamenvarchar(250)--表中的主键或表、临时表中的标识列名,@Id1varchar(20),@Id2varchar(20)--开始和结束的记录号,@Obj_IDint--对象ID--表中有复合主键的处理declare@strfdnvarchar(2000)--复合主键列表,@strjoinnvarchar(4000)--连接字段,@strwherenvarchar(2000)--查询条件select@Obj_ID=object_id(@QueryStr),@FdShow=caseisnull(@FdShow,'')when''then'*'else''+@FdShowend,@FdOrder=caseisnull(@FdOrder,'')when''then''else'orderby'+@FdOrderend,@QueryStr=casewhen@Obj_IDisnotnullthen''+@QueryStrelse'('+@QueryStr+')a'end--如果显示第一页,可以直接用top来完成if@PageCurrent=1beginselect@Id1=cast(@PageSizeasvarchar(20))exec('selecttop'+@Id1+@FdShow+'from'+@QueryStr+@FdOrder)returnend--如果是表,则检查表中是否有标识更或主键if@Obj_IDisnotnullandobjectproperty(@Obj_ID,'IsTable')=1beginselect@Id1=cast(@PageSizeasvarchar(20)),@Id2=cast((@PageCurrent-1)*@PageSizeasvarchar(20))select@FdName=namefromsyscolumnswhereid=@Obj_IDandstatus=0x80if@@rowcount=0--如果表中无标识列,则检查表中是否有主键beginifnotexists(select1fromsysobjectswhereparent_obj=@Obj_IDandxtype='PK')gotolbusetemp--如果表中无主键,则用临时表处理select@FdName=namefromsyscolumnswhereid=@Obj_IDandcolidin(selectcolidfromsysindexkeyswhere@Obj_ID=idandindidin(selectindidfromsysindexeswhere@Obj_ID=idandnamein(selectnamefromsysobjectswherextype='PK'andparent_obj=@Obj_ID)))if@@rowcount>1--检查表中的主键是否为复合主键beginselect@strfd='',@strjoin='',@strwhere=''select@strfd=@strfd+',['+name+']',@strjoin=@strjoin+'anda.['+name+']=b.['+name+']',@strwhere=@strwhere+'andb.['+name+']isnull'fromsyscolumnswhereid=@Obj_IDandcolidin(selectcolidfromsysindexkeyswhere@Obj_ID=idandindidin(selectindidfromsysindexeswhere@Obj_ID=idandnamein(selectnamefromsysobjectswherextype='PK'andparent_obj=@Obj_ID)))select@strfd=substring(@strfd,2,2000),@strjoin=substring(@strjoin,5,4000),@strwhere=substring(@strwhere,5,4000)gotolbusepkendendendelsegotolbusetemp/*--使用标识列或主键为单一字段的处理方法--*/lbuseidentity:exec('selecttop'+@Id1+@FdShow+'from'+@QueryStr+'where'+@FdName+'notin(selecttop'+@Id2+''+@FdName+'from'+@QueryStr+@FdOrder+')'+@FdOrder)return/*--表中有复合主键的处理方法--*/lbusepk:exec('select'+@FdShow+'from(selecttop'+@Id1+'a.*from(selecttop100percent*from'+@QueryStr+@FdOrder+')aleftjoin(selecttop'+@Id2+''+@strfd+'from'+@QueryStr+@FdOrder+')bon'+@strjoin+'where'+@strwhere+')a')return/*--用临时表处理的方法--*/lbusetemp:select@FdName='[ID_'+cast(newid()asvarchar(40))+']',@Id1=cast(@PageSize*(@PageCurrent-1)asvarchar(20)),@Id2=cast(@PageSize*@PageCurrent-1asvarchar(20))exec('select'+@FdName+'=identity(int,0,1),'+@FdShow+'into#tbfrom'+@QueryStr+@FdOrder+'select'+@FdShow+'from#tbwhere'+@FdName+'between'+@Id1+'and'+@Id2)GO

注:关于分页 SQLServer存储过程的内容就先介绍到这里,更多相关文章的可以留意

代码注释

作者:喵哥笔记

IDC笔记

学的不仅是技术,更是梦想!