Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 копировать дерево исходящее из 1 записи  [new]
muk07
Member

Откуда: Челябинск
Сообщений: 1851
Имеются таблицы А->B->C->D связанные по foreign key. Первичные ключи - identity.
Нужно скопировать дерево, исходящее из 1 записи таблицы А.
Новые записи, естественно, будут иметь свои identity
Начал писать - всё просто, но очень длинно.
Открываю курсор для каждой таблицы и копирую запись за записью. Итого 3х кратное вложение цикла.

Нет ли идеи, приводящей к более компактному решению.
(Имею мысль про динамический SQL с рекурсией - это не надо - слишком мудрёно)
Заранее спасибо.
1 июн 16, 09:47    [19244138]     Ответить | Цитировать Сообщить модератору
 Re: копировать дерево исходящее из 1 записи  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
muk07,

CTE не предлагать?
1 июн 16, 09:49    [19244149]     Ответить | Цитировать Сообщить модератору
 Re: копировать дерево исходящее из 1 записи  [new]
muk07
Member

Откуда: Челябинск
Сообщений: 1851
Спасибо, буду разбираться. Дело в том что я многие годы сидел на 2000.
И навыка использования СТЕ не имею. Надо приобретать.
Пока не понимаю как бы это могло мне помочь.
1 июн 16, 10:03    [19244206]     Ответить | Цитировать Сообщить модератору
 Re: копировать дерево исходящее из 1 записи  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
muk07,

http://www.sql-tutorial.ru/ru/book_recursive_cte.html
1 июн 16, 10:05    [19244220]     Ответить | Цитировать Сообщить модератору
 Re: копировать дерево исходящее из 1 записи  [new]
muk07
Member

Откуда: Челябинск
Сообщений: 1851
Спасибо, почитаю.
1 июн 16, 10:08    [19244232]     Ответить | Цитировать Сообщить модератору
 Re: копировать дерево исходящее из 1 записи  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7868
muk07,

версия сервера?
1 июн 16, 11:43    [19244794]     Ответить | Цитировать Сообщить модератору
 Re: копировать дерево исходящее из 1 записи  [new]
muk07
Member

Откуда: Челябинск
Сообщений: 1851
2008 R2
1 июн 16, 12:32    [19245118]     Ответить | Цитировать Сообщить модератору
 Re: копировать дерево исходящее из 1 записи  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
muk07
Нет ли идеи, приводящей к более компактному решению.
+
use tempdb;
go

create table dbo.A (id int identity primary key);
create table dbo.B (id int identity primary key, A_id int references dbo.A (id), v int);
create table dbo.C (id int identity primary key, B_id int references dbo.B (id), v int);

insert into dbo.A default values;
insert into dbo.B values (1, 2);
insert into dbo.C values (1, 3), (1, 4);
go

select * from dbo.A;
select * from dbo.B;
select * from dbo.C;
go

create table #ids (table_name sysname, id int, id_existing int, primary key (table_name, id));

declare @id int = 1;

insert into dbo.A
output
 N'A', inserted.id, @id into #ids
default values;

merge into dbo.B t
using (select i.id, B.v, B.id as B_id from #ids i join dbo.B on i.table_name = N'A' and B.A_id = i.id_existing) s on s.id = t.A_id
when not matched then
 insert (A_id, v) values (s.id, s.v)
output
 N'B', inserted.id, s.B_id into #ids;

merge into dbo.C t
using (select i.id, C.v, C.id as C_id from #ids i join dbo.C on i.table_name = N'B' and C.B_id = i.id_existing) s on s.id = t.B_id
when not matched then
 insert (B_id, v) values (s.id, s.v)
output
 N'C', inserted.id, s.C_id into #ids;
go

select * from dbo.A;
select * from dbo.B;
select * from dbo.C;
go

drop table dbo.C, dbo.B, dbo.A, #ids;
go
1 июн 16, 13:46    [19245554]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить