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

Откуда: Moscow
Сообщений: 907
Привет.

Имеется
  таблица1
   id, name

   таблица2
   id, name


id - первыичный, автогенерируемый ключ.

Нужно добавить данные из таблица1, в таблица2. При этом - id будут автоматически назначены новые.

Вопрос. Как получить связку: ID из старой таблицы, и присвоенное ему новое ID

Предварительное решение, которого удалось достичь:

   insert into таблица2 (name)
    OUTPUT INSERTED.Id, INSERTED.name  INTO [dbo].[MapTable]
  select [name] from таблица



Я МОГУ ориентироватся на Name, чтобы увидеть вставленные записи и как-то понять какой ID у них был (отдельным запросом)
Решение очень очень плохое, и не будет работать если name повторится хоть раз (а он повторится)

Не смог придумать как через Output передать данные из таблицы от которой идут данные.

Есть идеи ?
28 авг 15, 18:04    [18082982]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данныс из таблиц, с сохранением ID  [new]
хмхмхм
Guest
ProBiotek,

Смотри команду
set identity_insert off/on
28 авг 15, 18:10    [18083008]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данныс из таблиц, с сохранением ID  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
ProBiotek
Вопрос. Как получить связку: ID из старой таблицы, и присвоенное ему новое ID
declare @s table (id int identity primary key, v int);
declare @t table (id int identity primary key, v int);
declare @m table (s_id int, t_id int);

insert into @s values (1), (2);
insert into @t values (3), (4);

merge into @t t
using @s s on 1 = 0
when not matched then
 insert (v) values (s.v)
output
 s.id, inserted.id into @m;

select * from @t;
select * from @m;
28 авг 15, 18:11    [18083011]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данныс из таблиц, с сохранением ID  [new]
хмхмхм
Guest
ProBiotek,

вариант 2 - записывать в отдельный столбец старый идентификатор
28 авг 15, 18:11    [18083013]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данныс из таблиц, с сохранением ID  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
хмхмхм,

это чтобы вставить в таблицу со своими ID ?
не понимаю как буду использовать... хотелось бы чтобы они сами нагенерились там, а мне только узнать их.

ок. подумаю еще чем это поможет.
28 авг 15, 18:12    [18083016]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данныс из таблиц, с сохранением ID  [new]
хмхмхм
Guest
ProBiotek
Решение очень очень плохое, и не будет работать если name повторится хоть раз (а он повторится)


Если нет ничего, кроме name и он неуникален, тогда join по name + row_number() по id.
28 авг 15, 18:14    [18083024]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данныс из таблиц, с сохранением ID  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
invm
ProBiotek
Вопрос. Как получить связку: ID из старой таблицы, и присвоенное ему новое ID
declare @s table (id int identity primary key, v int);
declare @t table (id int identity primary key, v int);
declare @m table (s_id int, t_id int);

insert into @s values (1), (2);
insert into @t values (3), (4);

merge into @t t
using @s s on 1 = 0
when not matched then
 insert (v) values (s.v)
output
 s.id, inserted.id into @m;

select * from @t;
select * from @m;


Чего-то я не вкурил глубинного смысла "on 1 = 0"
28 авг 15, 18:21    [18083048]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данныс из таблиц, с сохранением ID  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
a_voronin
Чего-то я не вкурил глубинного смысла "on 1 = 0"
Глубинный смысл - получить not matched.
28 авг 15, 18:22    [18083055]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данныс из таблиц, с сохранением ID  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
ProBiotek
хотелось бы чтобы они сами нагенерились там, а мне только узнать их.
Ответов не читаем?
28 авг 15, 18:23    [18083057]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данныс из таблиц, с сохранением ID  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
invm,

еще как читаем ! буквально переношу уже на свои табы

Огромное спасибо. Огромное !

просто хотел убедится, что это точно мне подойдет - воспроизведя у себя.
28 авг 15, 18:29    [18083076]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данныс из таблиц, с сохранением ID  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
invm,

вообще я в восхищении от гениальности, и от этого Not matched :)
28 авг 15, 18:30    [18083081]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данныс из таблиц, с сохранением ID  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
invm,

Все работает. Круто :)
Спасибо.
28 авг 15, 18:38    [18083105]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данныс из таблиц, с сохранением ID  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4902
ProBiotek,

Я бы предложил вот такой вариант

USE test 
go 

declare @s table (id int identity(10,20) primary key, v int);
declare @t table (id int primary key, v int);

CREATE SEQUENCE ts
    START WITH 1
    INCREMENT BY 1 ;

declare @m table (s_id int, t_id int);

insert into @s(v) values (9999);
insert into @s(v) values (8888);
insert into @s(v) values (7777);
insert into @s(v) values (6666);


INSERT INTO @m(t_id, s_id) 
SELECT NEXT VALUE FOR ts, s.id FROM @s s;

INSERT INTO @t(id, v) 
SELECT m.t_id, s.v FROM @s s 
INNER JOIN @m m ON m.s_id = s.id

select * from @t;
select * from @m;

GO 
DROP SEQUENCE ts
28 авг 15, 18:39    [18083112]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данныс из таблиц, с сохранением ID  [new]
invm
Member

Откуда: Москва
Сообщений: 9845
ProBiotek
вообще я в восхищении от гениальности, и от этого Not matched :)
Это давно известный прием обхода ограничений output в инструкции insert.
28 авг 15, 18:43    [18083127]     Ответить | Цитировать Сообщить модератору
 Re: Перенос данныс из таблиц, с сохранением ID  [new]
ProBiotek
Member

Откуда: Moscow
Сообщений: 907
a_voronin,

По моему как-то слишком многословно.
Зачем нам создавать сиквенсы ? В решении invm, IDшники генерятся автоматически. То решение гораздо больше нравится своей элегантностью.
28 авг 15, 18:46    [18083132]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить