刚接触数据库编程,对SQL不熟。最近做了一个树型结构数据的东西。
表的结构设计为:
| ClassId | int | 类结点ID |
| ClassName | varchar(100) | 类结点名 |
| ParentId | int | 父结点ID |
| ParentPath | varchar(255) | 父结点到此类结点的路径 |
| RootId | int | 根结点ID |
| OrderId | int | 此结点在同一级结点中的序数 |
| ChildNumber | int | 子结点数 |
| PrevNodeId | int | 同级上一结点ID |
| NextNodeId | int | 同级下一结点ID |
alter procedure AddNewSiteClass
@ParentId int,
@ClassName varchar(100) = null
as

declare @parentDepth int, @parentPath varchar(255), @parentName varchar(100)
declare @depth int
declare @maxRootId int, @rootId int
declare @orderId int,@prevOrderId int
declare @prevId int
select @maxRootId = max(RootId) From TSiteClass
-- 如果是加在根结点上
if @ParentId = 0
begin
select @prevId = ClassId from TSiteClass where RootId = @maxRootId and Depth = 0
set @ParentId = 0
set @parentPath = '0'
set @orderId = 0
set @rootId = @maxRootId + 1
set @prevId = 0
set @depth = 0
end
-- 如果不是加在根结点上
else if @ParentId > 0
begin
declare @childNumber int
select
@rootId = RootId,
@parentName = ClassName,
@depth = Depth + 1,
@parentPath = ParentPath,
@childNumber = ChildNumber,
@prevOrderId = OrderId
from TSiteClass
where @ParentId = ClassId
set @orderId = @prevOrderId + 1
if @parentPath = '0'
begin set @parentPath = cast(@ParentId as varchar) end
else
begin set @parentPath = @parentPath + ',' + cast(@ParentId as varchar) end
if @childNumber > 0
begin
select @prevOrderId = max(OrderId) from TSiteClass where @ParentId = ParentId
select @prevId = ClassId from TSiteClass where @ParentId = ParentId and @prevOrderId = OrderId
set @orderId = @prevOrderId + 1
end
else
begin
set @prevId = 0
--set @orderId = 1
end
end
-- 插入一个新的类别
insert into TSiteClass
(ClassName,
ParentId,
ParentPath,
RootId,
OrderId,
Depth,
ChildNumber,
PrevNodeId,
NextNodeId)
values
(@ClassName,
@ParentId,
@parentPath,
@rootId,
@orderId,
@depth,
0,
@prevId,
0)
-- 更新受影响的行
declare @newClassId int
select @newClassId = max(ClassId) from TSiteClass
if @prevId > 0
update TSiteClass set NextNodeId = @newClassId where ClassId = @prevId 
if @ParentId > 0
begin
--父结点所拥有的子孙结点数加一
update TSiteClass set ChildNumber = ChildNumber + 1 where ClassId = @ParentId
--比被插入的OrderId大的通通加一
update TSiteClass
set OrderId = OrderId + 1
where @rootId = RootId and OrderId >= @orderId and ClassId != @newClassId
end
浙公网安备 33010602011771号