第二个灵魂 发表于 2015-1-16 22:28:41

MSSQL网页编程之树形数据的处置

因此我们的方案中要构造这种逆操作。Event_type增加一种FLASHBACK_EVENT。这类操作形式与Query_Event相同,都是简单的SQL语句,只是包含了将数据恢复的操作。数据
形貌:会商怎样处置树形数据,排序,新增,修正,复制,删除,数据完全性反省,汇总统计

表布局形貌及数据情况:

表名tb,假如修正表名,则响应修正一切数据处置中触及到的表名tb

id为编号(标识字段+主键),pid为下级编号,name为称号,前面能够自行增添其他字段.

但凡未特别标注的中央,对自行增添的字段不影响处置了局/*--数据测试情况
表名tb,假如修正表名,则响应修正一切数据处置中触及到的表名tb
id为编号(标识字段+主键)
pid为下级编号
name为称号,前面能够自行增添其他字段.

但凡未特别标注的中央,对自行增添的字段不影响处置了局


--表情况

createtabletb(idintidentity(1,1)notnullconstraintPK_tbprimarykeyclustered
,pidint,namevarchar(20))
insertintotb
select0,中国
unionallselect0,美国
unionallselect0,加拿年夜
unionallselect1,北京
unionallselect1,上海
unionallselect1,江苏
unionallselect6,姑苏
unionallselect7,常熟
unionallselect6,南京
unionallselect6,无锡
unionallselect2,纽约
unionallselect2,旧金山
go


--处置中必要利用的函数及存储历程

--1.自界说函数--猎取编码累计
createfunctionf_getmergid(@idint)
returnsvarchar(8000)
as
begin
declare@revarchar(8000),@pidint

--为了数字排序一般,必要一致编码宽度
declare@idlenint,@idheadervarchar(20)
select@idlen=max(len(id))
,@idheader=space(@idlen)
fromtb

--失掉编码累计
set@re=right(@idheader+cast(@idasvarchar),@idlen)
select@pid=pidfromtbwhereid=@id
while@@rowcount>0
select@re=right(@idheader+cast(@pidasvarchar),@idlen)+,+@re
,@pid=pidfromtbwhereid=@pid
return(@re)
end
go


--2.自界说函数--检测某个编码动身,是不是被轮回援用
createfunctionf_chkid(@idint)
returnsbit--轮回,前往1,不然前往0
as
begin
declare@rebit,@pidint

set@re=0

--检测
select@pid=pidfromtbwhereid=@id
while@@rowcount>0
begin
if@pid=@id
begin
set@re=1
gotolbErr
end
select@pid=pidfromtbwhereid=@pid
end

lbErr:
return(@re)
end
go

/*--数据复制

假如表中包括自界说字段,必要修正存储历程
存在嵌套不凌驾32层的成绩.
--*/

--3.复制指定结点下的子结点到另外一个结点下
createprocp_copy
@s_idint,--复制该项下的一切子项
@d_idint,--复制到此项下
@new_idint--新增添项的入手下手编号
as
declare@nidint,@oidint,@namevarchar(20)
selectid,nameinto#tempfromtbwherepid=@s_idandid<@new_id
whileexists(select1from#temp)
begin
select@oid=id,@name=namefrom#temp
insertintotbvalues(@d_id,@name)
set@nid=@@identity
execp_copy@oid,@nid,@new_id
deletefrom#tempwhereid=@oid
end
go

--4.批量复制的存储历程--复制指定结点及其上面的一切子结点,并天生新结点
createprocp_copystr
@s_idvarchar(8000)--要复制项的列表,用逗号分开
as
declare@nidint,@oidint,@namevarchar(20)
set@s_id=,+@s_id+,
selectid,nameinto#tempfromtb
wherecharindex(,+cast(idasvarchar)+,,@s_id)>0
whileexists(select1from#temp)
begin
select@oid=id,@name=namefrom#temp
insertintotbvalues(@oid,@name)
set@nid=@@identity
execp_copy@oid,@nid,@nid
deletefrom#tempwhereid=@oid
end
go

--6.失掉指定id的子id列表
createfunctionf_getchildid(@idint)
returns@retable(idint)
as
begin
insertinto@reselectidfromtbwherepid=@id
while@@rowcount>0
insertinto@reselecta.id
fromtbainnerjoin@rebona.pid=b.id
wherea.idnotin(selectidfrom@re)
return
end
go


--7.失掉指定id的父id列表
createfunctionf_getparentid(@idint)
returns@retable(idint)
as
begin
declare@pidint
select@pid=pidfromtbwhereid=@id
while@pid0
begin
insertinto@revalues(@pid)
select@pid=pidfromtbwhereid=@pid
end
return
end
go


--8.删除指定结点

createprocp_delete
@idint,--要删除的id
@deletechildbit=0--是不是删除子1.删除子,0.假如@id有子,则删除失利.
as
if@deletechild=1
deletefromtbwheredbo.f_getmergid(id)likedbo.f_getmergid(@id)+%
else
ifexists(select1fromtbwherepid=@id)
gotolbErr
else
deletefromtbwhereid=@id

return

lbErr:
RAISERROR(该结点下有子结点,不克不及删除,16,1)
go


--9.失掉编码累计及编码级别表,这个是针对全表的,次要是应当于全表处置:

createfunctionf_getbmmerg()

returns@retable(idint,idmergvarchar(8000),levelint)

as

begin

declare@idlenint,@idheadervarchar(20),@levelint

select@idlen=max(len(id)),@idheader=space(@idlen)fromtb

set@level=1

insertinto@reselectid,right(@idheader+cast(idasvarchar),@idlen),@level

fromtbwherepid=0

while@@rowcount>0

begin

set@level=@level+1

insertinto@reselectb.id,a.idmerg+,+right(@idheader+cast(b.idasvarchar),@idlen),@level

from@reainnerjointbbona.id=b.pid

wherea.level=@level-1



end

return

end

go


--使用:

/*--数据显现排序--*/
--分级显现--横向,先一级,后二级...
select*fromtborderbypid

--分级显现--纵向
select*fromtborderbydbo.f_getmergid(id)
go

/*--数据统计--*/
--分级统计,每一个区域下的明细区域数
select*,
明细区域数=(selectcount(*)fromtbwheredbo.f_getmergid(id)likedbo.f_getmergid(a.id)+,%)
fromtbaorderbydbo.f_getmergid(id)

go
/*--数据新增,修正

数据新增,修正(包含修正所属的种别)没有甚么技能
,只必要反省所属的下级是不是存在就好了.这个能够复杂的用上面的语句来办理:
ifexists(select1fromtbwhereid=@id)print存在elseprint不存在
--*/


--删除美国的数据
--execp_delete2--不包括子,由于有美国下有子,以是删除会堕落
execp_delete2,1--包括子,将删除美国及一切数据
go


原文拜见我在CSDN上宣布的贴子

http://expert.csdn.net/Expert/topic/2285/2285830.xml?temp=.1212885

BlackHole黑洞引擎,写入的任何数据都会消失,一般用于记录binlog做复制的中继

飘灵儿 发表于 2015-1-19 14:04:03

如果你是从“学习某一种数据库应用软件,从而获得应聘的资本和工作机会”的角度来问的话。

仓酷云 发表于 2015-1-26 05:13:16

比如日志传送、比如集群。。。

兰色精灵 发表于 2015-2-4 13:30:33

现在是在考虑:如果写到服务器端,我一下搞他个10个存储过程导过去,那久之服务器不就成垃圾箱了吗?即便优化了我的中间层.

透明 发表于 2015-2-9 23:48:07

大侠们有推荐的书籍和学习方法写下吧。

活着的死人 发表于 2015-2-28 09:25:30

换言之,只有在不断的失败中尝试成功,而关于失败的总结却是很少的

精灵巫婆 发表于 2015-3-9 22:06:34

是要和操作系统进行Socket通讯的场景。否则建议慎重!

小妖女 发表于 2015-3-17 02:09:02

是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQLServer的字段类型更加简洁统一。

蒙在股里 发表于 2015-3-23 17:02:41

语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的!
页: [1]
查看完整版本: MSSQL网页编程之树形数据的处置