Есть таблица, в которой связаны 2 первых поля. Таблица устройств. В ней есть иерархия.
CREATE TABLE [dbo].[DEVICES]
(
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[PARENT] [int] NOT NULL ,
[DEVLEVEL] [smallint] NULL ,
[DEVELOPER] [nvarchar] (40) COLLATE Cyrillic_General_CI_AS NULL ,
[DEVDATE] [smalldatetime] NULL ,
[ALIAS] [nvarchar] (50) COLLATE Cyrillic_General_CI_AS NULL ,
[DEVICENAME] [nvarchar] (50) COLLATE Cyrillic_General_CI_AS NULL ,
[DESCRIPTION] [ntext] COLLATE Cyrillic_General_CI_AS NULL ,
[STATUS] [smallint] NOT NULL ,
[CODE] [smallint] NULL ,
[Position] [int] NULL,
CONSTRAINT [PK_DEVICES] PRIMARY KEY CLUSTERED ([ID]) ON [PRIMARY],
CONSTRAINT [FK_DEVICES_DEVICES] FOREIGN KEY
([PARENT]) REFERENCES [dbo].[DEVICES] ([ID])
)
Т.е.
| id | parent | Дальше идут данные |
| 1 | 1 | |
| 2 | 1 | |
| 3 | 1 | |
| 4 | 3 | |
| 5 | 2 | |
И тому подобное.
т.е. есть одно устройство к нему относяться 3 устройства. вот так.
|------1.1 Dev1
| |----2.1 Dev2
| |----3.1 Dev3
Ну и так далее.
Требуется СКОПИРОВАТЬ это устройство в другое место. к примеру.
|------1.1 Dev1
| |----2.1 Dev2
| |----3.1 Dev3
| |------4.3 Dev1
| | |----5.4 Dev2
| | |----6.4 Dev3
Т.е. вся ветка копируется в другое дочернее устройство.
Нужна сама процедура копирования. Т.е. задаешь ID, как в примере, 1(id устройства которое копируем),
и куда DEST_ID, как в примере, 3(id устройства В которое копируем). И вся ветка копируется.
Люди помогите пожайлуста, я теоретически представляю как это сделать, но знаний моих не хватает.
Если чего не понятно , спросите, я отвечу.
Сейчас получилась процедура(принимаю любые другие процедуры),проблема в том, что эта процетура зацикливается:
ALTER procedure move_devices
@id int,
@dest_id int
as
declare @ta table ([id] int)
declare @tb table ([id] int)
insert into @ta select @id
insert into @tb select @id
while 1=1
begin
insert into devices(PARENT, DEVLEVEL, DEVELOPER, DEVDATE, ALIAS,
DEVICENAME, [DESCRIPTION], STATUS, CODE, Position)
select @dest_id, DEVLEVEL, DEVELOPER, DEVDATE, ALIAS, DEVICENAME,
[DESCRIPTION], STATUS, CODE, Position
from devices
where [id] in (select [id] from @ta)
select @dest_id = @@identity
insert into @tb select * from @ta
delete from @ta
insert into @ta select [id] from devices where parent in (select [id] from
@tb)
delete from @tb
if (select count(*) from @ta)<1 break
end