分手快乐 发表于 2015-1-16 22:42:52

MSSQL网页设计分页 SQLServer存储历程

在JOIN操作中(需要从多个数据表提取数据时),MySQL只有在主键和外键的数据类型相同时才能使用索引。server|sqlserver|存储历程|分页
/*--用存储历程完成的分页程序显现指定表、视图、查询了局的第X页关于表中主键或标识列的情形,间接从原表取数查询,别的情形利用一时表的办法假如视图或查询了局中有主键,不保举此办法--邹建2003.09--*//*--挪用示例execp_show区域材料execp_show区域材料,5,3,区域编号,区域称号,助记码,区域编号--*//*由于要顾及通用性,以是对带排序的查询语句有必定请求.假如先排序,再出了局.就是:execp_showselecttop100percent*from区域材料orderby区域称号,5,3,区域编号,区域称号,助记码,区域称号--查询语句加上:top100percent//top时*/ifexists(select*fromdbo.sysobjectswhereid=object_id(N.)andOBJECTPROPERTY(id,NIsProcedure)=1)dropprocedure.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,)whenthen*else+@FdShowend,@FdOrder=caseisnull(@FdOrder,)whenthenelseorderby+@FdOrderend,@QueryStr=casewhen@Obj_IDisnotnullthen+@QueryStrelse(+@QueryStr+)aend--假如显现第一页,能够间接用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=PKandparent_obj=@Obj_ID)))if@@rowcount>1--反省表中的主键是不是为复合主键beginselect@strfd=,@strjoin=,@strwhere=select@strfd=@strfd+,[+name+],@strjoin=@strjoin+anda.[+name+]=b.[+name+],@strwhere=@strwhere+andb.[+name+]isnullfromsyscolumnswhereid=@Obj_IDandcolidin(selectcolidfromsysindexkeyswhere@Obj_ID=idandindidin(selectindidfromsysindexeswhere@Obj_ID=idandnamein(selectnamefromsysobjectswherextype=PKandparent_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=,@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
在ORDERBY操作中,MySQL只有在排序条件不是一个查询条件表达式的情况下才使用索引。(虽然如此,在涉及多个数据表查询里,即使有索引可用,那些索引在加快ORDERBY方面也没什么作用)。

不帅 发表于 2015-1-19 21:32:42

大家注意一点。如下面的例子:

分手快乐 发表于 2015-1-28 11:40:25

在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。

透明 发表于 2015-2-13 13:15:57

原来公司用过MYSQL自己也只是建个表写个SQL

精灵巫婆 发表于 2015-3-3 21:49:54

一个百万级别的基本信息表A,一个百万级别的详细记录表B,A中有个身份证id,B中也有身份id;先要找出A中在B的详细记录。

小妖女 发表于 2015-3-11 13:58:33

原来公司用过MYSQL自己也只是建个表写个SQL

再现理想 发表于 2015-3-18 17:09:47

SP4是一个累积性的ServicePack,包含自以前的ServicePack发布以来所有的修补程序(包括MS03-031安全公告)。

山那边是海 发表于 2015-3-26 07:19:08

一个是把SQL语句写到客户端,可以使用DataSet进行加工;
页: [1]
查看完整版本: MSSQL网页设计分页 SQLServer存储历程