Здравствуйте, L_G, Вы писали:
L_G>В табличке хранятся разные деревья, т.е. группы записей, иерархически связанные по ParentId -> Id (ParentId is null — "корни").
L_G>Упрощенно, такая структура:
L_G>L_G>create table Trees (
L_G>Id int identity (1, 1) primary key, -- автоинкрементное поле в синтаксисе MS SQL
L_G>ParentId int null foreign key references Trees(Id), -- можно и без констрейнта, не суть
L_G>TreeId int not null ) -- все узлы с одним TreeId - это одно дерево, а "корней" м.б. и несколько
L_G>
Задача — склонировать дерево (для каждой записи из набора с одним TreeId создать по 1 записи с новым TreeId с сохранением структуры ссылок ParentId -> Id).
L_G>Можно ли написать такую процедуру/скрипт без всякой рекурсии и циклов, простыми insert/update?
L_G>А без временных таблиц и т.п.?
Легко
insert into Trees (ParentId, TreeId)
select Id, @NewTreeId
from Trees
where TreeId = @OldTreeId
update t1
set ParentId = t3.Id
from Trees t1
join Trees t2 on t1.ParentId = t2.Id
join Trees t3 on t3.ParentId = t2.ParentId
where t1.TreeId = @NewTreeId
and t2.TreeId = @OldTreeId
and t3.TreeId = @NewTreeId
В универе же такое делают на уроках про графы\спиcки\деревья