declare @t table(id int, pid int, name nvarchar(25), fullpath nvarchar(max))
insert into @t(id, pid, name, fullpath)
select 0, cast(null as int), '/', '/' union all
select 1, 0, 'folder1', '/folder1' union all
select 2, 0, 'folder2', '/folder2' union all
select 11, 1, 'folder11_renamed', '/folder1/folder11' union all
select 111, 11, 'folder111', '/folder1/folder11/folder111' union all
select 1111, 111, 'file1111', '/folder1/folder11/folder111/file1111' union all
select 112, 11, 'folder112', '/folder1/folder11/folder112' union all
select 21, 2, 'file21', '/folder2/file21'
declare @renamed_id int
set @renamed_id = 11
;with cte as (
select c.id, p.fullpath + '/' + c.name as fullpath
from @t as c
join @t as p on p.id = c.pid
where c.id = @renamed_id
union all
select t.id, c.fullpath + '/' + t.name as fullpath
from @t as t
join cte as c on c.id = t.pid
)
update t
set t.fullpath = c.fullpath
from @t as t
join cte as c on c.id = t.id
select * from @t
id pid name fullpath
----------- ----------- ------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0 NULL / /
1 0 folder1 /folder1
2 0 folder2 /folder2
11 1 folder11_renamed /folder1/folder11_renamed
111 11 folder111 /folder1/folder11_renamed/folder111
1111 111 file1111 /folder1/folder11_renamed/folder111/file1111
112 11 folder112 /folder1/folder11_renamed/folder112
21 2 file21 /folder2/file21
(8 row(s) affected)