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

Откуда: Израиль / Москва
Сообщений: 296
Здравствуйте.

У меня есть таблица, в которую нужно вставить данные из другой таблицы, - точно такой же структуры. В этой другой таблице соблюдены зависимости LogId и ParentLogId.

Но когда я добавляю в новую таблицу, то идентификатор LogId становится другим (identity)и мне, вставляя данные, нужно сохранить эту зависимость.

Не уверен, что я объяснил понятно, но мне нужно скопировать данные и чтобы зависимость между логами сохранилась.

Спасибо.

CREATE TABLE [dbo].[Logs](
[LogId] [int] IDENTITY(1,1) NOT NULL,
[ParentLogId] [int] NOT NULL,
[LogData] [nvarchar](50) NULL
) ON [PRIMARY]
11 май 17, 19:46    [20473774]     Ответить | Цитировать Сообщить модератору
 Re: Как вставить данные, когда нужно добавлять идентификатор родителя?  [new]
FedorinoFF
Member

Откуда:
Сообщений: 112
igoro1975, вставляешь в новый лог запись парента, запоминаешь его новую id, и потом ее используешь для дочерних записей
12 май 17, 09:11    [20474577]     Ответить | Цитировать Сообщить модератору
 Re: Как вставить данные, когда нужно добавлять идентификатор родителя?  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
igoro1975, перед вставкой:

SET IDENTITY_INSERT [dbo].[Logs] ON;  


Только лучше сначала полностью прочитайте, для чего это: https://docs.microsoft.com/en-us/sql/t-sql/statements/set-identity-insert-transact-sql
12 май 17, 10:20    [20474926]     Ответить | Цитировать Сообщить модератору
 Re: Как вставить данные, когда нужно добавлять идентификатор родителя?  [new]
igoro1975
Member

Откуда: Израиль / Москва
Сообщений: 296
CREATE TABLE Lalala (
    LogId int,
    ParentLogId int,
    OldLogId int,
    OldParentLogId int
);

INSERT INTO Lalala (LogId, ParentLogId, OldLogId, OldParentLogId) VALUES (5, NULL, 1, NULL)
INSERT INTO Lalala (LogId, ParentLogId, OldLogId, OldParentLogId) VALUES (6, NULL, 2, 1)


Я так и не понимаю, как мне сейчас во второй строке обновить ParentLogId на 5 - нвоое значение LogId родительской строки.

Спасибо.
13 май 17, 11:25    [20478422]     Ответить | Цитировать Сообщить модератору
 Re: Как вставить данные, когда нужно добавлять идентификатор родителя?  [new]
TaPaK
Member

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

?
INSERT INTO Lalala (LogId, ParentLogId, OldLogId, OldParentLogId) VALUES (6, 5, 2, 1)
13 май 17, 13:15    [20478619]     Ответить | Цитировать Сообщить модератору
 Re: Как вставить данные, когда нужно добавлять идентификатор родителя?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5112
igoro1975
Я так и не понимаю, как мне сейчас во второй строке обновить ParentLogId на 5 - нвоое значение LogId родительской строки.
апдейт ParentLogId с рекурсивным CTE по OldLogId и OldParentLogId
читать
14 май 17, 15:33    [20480149]     Ответить | Цитировать Сообщить модератору
 Re: Как вставить данные, когда нужно добавлять идентификатор родителя?  [new]
invm
Member

Откуда: Москва
Сообщений: 9122
igoro1975
мне нужно скопировать данные и чтобы зависимость между логами сохранилась.
declare @source table (id int primary key, parent_id int null);
declare @target table (id int identity(10, 1) primary key, parent_id int null);

insert into @source values (1, null), (2, null), (3, 1), (4, 2), (5, 3), (6, 3);

select * from @source;

declare @tmp table (id int, new_id int);

merge into @target t
using (select id from @source) s on 1 = 0
when not matched then
 insert (parent_id) values (null)
output
 s.id, inserted.id into @tmp (id, new_id);

update t
 set
  parent_id = b.new_id
from
 @source s join
 @tmp a on a.id = s.id join
 @target t on t.id = a.new_id join
 @tmp b on b.id = s.parent_id;

select * from @target;
14 май 17, 17:02    [20480256]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить