sql使用递归更新树级表记录
表结构如下
ORG_INFO
ORG_ID,ORG_PARENT_ID,ORG_PARENT_PATH
其中需更新ORG_PARENT_PATH字段,该字段值为父节点的ORG_PARENT_PATH+’.’+父节点的ORG_ID
思路
先找出根节点,设置好其ORG_PARENT_PATH
依次递归找出子节点,更新ORG_PARENT_PATH字段值
代码如下
代码
Declare @Id nvarchar(36)
Set @Id = '549C2E32-3927-4E5E-AA26-993B460D067A'; ---在此修改父节点
With RootNodeCTEee(ORG_ID,ORG_PARENT_ID,ORG_PARENT_PATH)
As
(
Select ORG_ID,ORG_PARENT_ID,ORG_PARENT_PATH From ORG_INFO Where ORG_ID In (@Id)
Union All
Select ORG_INFO.ORG_ID,ORG_INFO.ORG_PARENT_ID,ORG_INFO.ORG_PARENT_PATH From RootNodeCTEee
Inner Join ORG_INFO
On RootNodeCTEee.ORG_ID = ORG_INFO.ORG_PARENT_ID
)
select * into #T from RootNodeCTEee
--select * from #T
declare @ORG_ID varchar(36) --
declare @ORG_PARENT_ID varchar(36) --
declare @ORG_PARENT_PATH varchar(512) --
declare @TempORG_PARENT_PATH varchar(512) --
Declare row Cursor For --声明游标row
Select ORG_ID,ORG_PARENT_ID,ORG_PARENT_PATH From #T--
--select * from RootNodeCTEee
Open row
Fetch Next From row into @ORG_ID,@ORG_PARENT_ID,@ORG_PARENT_PATH --
Fetch Next From row into @ORG_ID,@ORG_PARENT_ID,@ORG_PARENT_PATH --
While @@FETCH_STATUS = 0 --完成状态
begin
print(@ORG_ID+'__'+@ORG_PARENT_ID+'__'+@ORG_PARENT_PATH)
select @TempORG_PARENT_PATH= ORG_PARENT_PATH + '.'+ORG_ID from ORG_INFO where ORG_ID=@ORG_PARENT_ID
update ORG_INFO set ORG_PARENT_PATH = @TempORG_PARENT_PATH where ORG_ID = @ORG_ID
Fetch Next From row into @ORG_ID,@ORG_PARENT_ID,@ORG_PARENT_PATH
end
Close row
Deallocate row
drop table #T
Declare @Id nvarchar(36)
Set @Id = '549C2E32-3927-4E5E-AA26-993B460D067A'; ---在此修改父节点
With RootNodeCTEee(ORG_ID,ORG_PARENT_ID,ORG_PARENT_PATH)
As
(
Select ORG_ID,ORG_PARENT_ID,ORG_PARENT_PATH From ORG_INFO Where ORG_ID In (@Id)
Union All
Select ORG_INFO.ORG_ID,ORG_INFO.ORG_PARENT_ID,ORG_INFO.ORG_PARENT_PATH From RootNodeCTEee
Inner Join ORG_INFO
On RootNodeCTEee.ORG_ID = ORG_INFO.ORG_PARENT_ID
)
select * into #T from RootNodeCTEee
--select * from #T
declare @ORG_ID varchar(36) --
declare @ORG_PARENT_ID varchar(36) --
declare @ORG_PARENT_PATH varchar(512) --
declare @TempORG_PARENT_PATH varchar(512) --
Declare row Cursor For --声明游标row
Select ORG_ID,ORG_PARENT_ID,ORG_PARENT_PATH From #T--
--select * from RootNodeCTEee
Open row
Fetch Next From row into @ORG_ID,@ORG_PARENT_ID,@ORG_PARENT_PATH --
Fetch Next From row into @ORG_ID,@ORG_PARENT_ID,@ORG_PARENT_PATH --
While @@FETCH_STATUS = 0 --完成状态
begin
print(@ORG_ID+'__'+@ORG_PARENT_ID+'__'+@ORG_PARENT_PATH)
select @TempORG_PARENT_PATH= ORG_PARENT_PATH + '.'+ORG_ID from ORG_INFO where ORG_ID=@ORG_PARENT_ID
update ORG_INFO set ORG_PARENT_PATH = @TempORG_PARENT_PATH where ORG_ID = @ORG_ID
Fetch Next From row into @ORG_ID,@ORG_PARENT_ID,@ORG_PARENT_PATH
end
Close row
Deallocate row
drop table #T
总结
使用With可以递归查找数据生成表
当然也可以直接写SP完成
首次使用LiveWriter
不知道怎么设置代码格式和设置摘要
发布成日记了
网页进入博客园
手动更改
还是手动方便呀