仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2004|回复: 9
打印 上一主题 下一主题

[学习教程] MSSQL网站制作之分页查询

[复制链接]
因胸联盟 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:28:41 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
用一个库#bak_database存放这些历史数据。分页
/*--用存储历程完成的分页程序

显现指定表、视图、查询了局的第X页
关于表中主键或标识列的情形,间接从原表取数查询,别的情形利用一时表的办法
假如视图或查询了局中有主键,不保举此办法

--*/

/*--挪用示例
execp_show区域材料

execp_show区域材料,5,3,区域编号,区域称号,助记码,区域编号
--*/

ifexists(select*fromdbo.sysobjectswhereid=object_id(N[dbo].[p_show])andOBJECTPROPERTY(id,NIsProcedure)=1)
dropprocedure[dbo].[p_show]
GO

CREATEProcp_show
@QueryStrnvarchar(4000),--表名、视图名、查询语句
@PageSizeint=10,--每页的巨细(行数)
@PageCurrentint=1,--要显现的页
@FdShownvarchar(4000)=,--要显现的字段列表,假如查询了局有标识字段,必要指定此值,且不包括标识字段
@FdOrdernvarchar(1000)=--排序字段列表
as
declare@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=1
begin
select@Id1=cast(@PageSizeasvarchar(20))
exec(selecttop+@Id1+@FdShow+from+@QueryStr+@FdOrder)
return
end

--假如是表,则反省表中是不是有标识更或主键
if@Obj_IDisnotnullandobjectproperty(@Obj_ID,IsTable)=1
begin
select@Id1=cast(@PageSizeasvarchar(20))
,@Id2=cast((@PageCurrent-1)*@PageSizeasvarchar(20))

select@FdName=namefromsyscolumnswhereid=@Obj_IDandstatus=0x80
if@@rowcount=0--假如表中无标识列,则反省表中是不是有主键
begin
ifnotexists(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--反省表中的主键是不是为复合主键
begin
select@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=PKandparent_obj=@Obj_ID
)))
select@strfd=substring(@strfd,2,2000)
,@strjoin=substring(@strjoin,5,4000)
,@strwhere=substring(@strwhere,5,4000)
gotolbusepk
end
end
end
else
gotolbusetemp

/*--利用标识列或主键为单一字段的处置办法--*/
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+)a
leftjoin(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

在JOIN操作中(需要从多个数据表提取数据时),MySQL只有在主键和外键的数据类型相同时才能使用索引。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-16 15:32

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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