仓酷云

标题: MSSQL网站制作之分页查询 [打印本页]

作者: 因胸联盟    时间: 2015-1-16 22:28
标题: MSSQL网站制作之分页查询
用一个库#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只有在主键和外键的数据类型相同时才能使用索引。
作者: 莫相离    时间: 2015-1-17 12:56
以前的DTS轻盈简单。但是现在的SSIS虽然功能强大了很多,但是总是让人感觉太麻烦。看看论坛中询问SSIS的贴子就知道。做的功能太强大了,往往会有很多用户不会用了
作者: 简单生活    时间: 2015-1-20 19:10
sqlserver的痛苦之处在于有用文档的匮乏,很多只是表明的东西
作者: 再见西城    时间: 2015-1-29 15:35
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
作者: 柔情似水    时间: 2015-2-6 02:30
where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
作者: 金色的骷髅    时间: 2015-2-15 02:35
对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。
作者: 飘飘悠悠    时间: 2015-3-4 11:09
SP4包括用于以下SQLServer2000组件的程序包:Database组件(下载文件:SQL2000-KB884525-SP4-x86.EXE)更新SQLServer2000的32位Database组件,包括数据库引擎、复制、客户端连接组件及工具。有关其他信息,请参阅ReadmeSql2k32Sp4.htm。AnalysisServices组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE)更新SQLServer2000的32位AnalysisServices。
作者: 兰色精灵    时间: 2015-3-11 18:42
SQL语言是学习所有数据库产品的基础,无论你是做数据库管理还是做数据库开发都是这样。不过具体学习的侧重点要看你将来做哪一块,如果是做数据库管理(DBA),侧重点应该放在SQLServer的系统管理上.
作者: 分手快乐    时间: 2015-3-19 07:47
但换公司用MSSQL2K感觉自己好像根本就不了解MSSQL。什么DTS触发器以前根本没用过。
作者: 深爱那片海    时间: 2015-3-27 14:25
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2