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

Откуда:
Сообщений: 81
Не могу разобраться сам, прошу помощи.

Идет перенос записей из двух таблиц, связанных 1-ко-многим и со своими уникальными ID
Запись идет в таблицы идентичные по структуре, но в другой базе (то есть ключевые поля генерятся по своим правилам).

как при вставке данных первой (главной) таблицы получить для этого потока ID в новой базе чтобы подчиненную таблицу положить без потери целостности данных?

Пример:
исходные таблицы
таблица TaskOld (id, name)
таблица SubTaskOld (id, name,id_task)

конечные таблицы
таблица TaskNew (id, name)
таблица SubTaskNew (id, name,id_taskNew, id_Company)

То есть каким инструментом загружая в TaskNew из TaskOld данные (поле name) получить таблицу типа (id_TaskOld, id_TaskNew).
3 апр 12, 17:29    [12359323]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение пакета (integration Servises), как получить identity из предыдущего потока?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
scope_identity() / output / альтернативный ключ
3 апр 12, 17:30    [12359335]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение пакета (integration Servises), как получить identity из предыдущего потока?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Хотя, про SSIS не знаю.
3 апр 12, 17:31    [12359339]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение пакета (integration Servises), как получить identity из предыдущего потока?  [new]
Dzianis
Member

Откуда:
Сообщений: 81
Гавриленко Сергей Алексеевич
scope_identity() / output / альтернативный ключ

это все если бы обработка и загрузка данных в таблицу происходила с помощью t-sql
3 апр 12, 17:33    [12359351]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение пакета (integration Servises), как получить identity из предыдущего потока?  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3754
Dzianis
Гавриленко Сергей Алексеевич
scope_identity() / output / альтернативный ключ

это все если бы обработка и загрузка данных в таблицу происходила с помощью t-sql

напрямую НИКАК.
Обойти это можно через LookUp компонент который инсертит но не нужно, ибо производитльность такого изврата ниже плинтуса.
3 апр 12, 19:06    [12359946]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение пакета (integration Servises), как получить identity из предыдущего потока?  [new]
Dzianis
Member

Откуда:
Сообщений: 81
Ivan Durak
Dzianis
пропущено...

это все если бы обработка и загрузка данных в таблицу происходила с помощью t-sql

напрямую НИКАК.
Обойти это можно через LookUp компонент который инсертит но не нужно, ибо производитльность такого изврата ниже плинтуса.

пичалька.
Остается тогда перенос в темповою таблицу и обработка просто T-Sql скриптом.
3 апр 12, 19:23    [12360021]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение пакета (integration Servises), как получить identity из предыдущего потока?  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3754
Dzianis
Ivan Durak
пропущено...

напрямую НИКАК.
Обойти это можно через LookUp компонент который инсертит но не нужно, ибо производитльность такого изврата ниже плинтуса.

пичалька.
Остается тогда перенос в темповою таблицу и обработка просто T-Sql скриптом.

можно так.
А можно
(Если name в таске уникальный!) сперва загрезуть напрямую TaskOld в TaskNew
а потом во-вторую очередь использовть как источник данных скрипт

Select id, name,id_task, t.name as Oldtask_name
from SubTaskOld st
inner join TaskOld t on t.id = st.id_task

и к нему лукапить TaskNew по условию name = Oldtask_name
3 апр 12, 19:30    [12360056]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение пакета (integration Servises), как получить identity из предыдущего потока?  [new]
Dzianis
Member

Откуда:
Сообщений: 81
Ivan Durak
можно так.
А можно
(Если name в таске уникальный!) сперва загрезуть напрямую TaskOld в TaskNew
а потом во-вторую очередь использовть как источник данных скрипт

Select id, name,id_task, t.name as Oldtask_name
from SubTaskOld st
inner join TaskOld t on t.id = st.id_task

и к нему лукапить TaskNew по условию name = Oldtask_name

Нет гарантии что Name уникальный.
пока альтернативой является вставка значений в таблицу через script component в режиме Destination
и запись пар ID в выходной поток.
собственно по insert на каждую запись получается. Не комильфо...
3 апр 12, 19:36    [12360086]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение пакета (integration Servises), как получить identity из предыдущего потока?  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3754
Dzianis
Ivan Durak
можно так.
А можно
(Если name в таске уникальный!) сперва загрезуть напрямую TaskOld в TaskNew
а потом во-вторую очередь использовть как источник данных скрипт

Select id, name,id_task, t.name as Oldtask_name
from SubTaskOld st
inner join TaskOld t on t.id = st.id_task

и к нему лукапить TaskNew по условию name = Oldtask_name

Нет гарантии что Name уникальный.
пока альтернативой является вставка значений в таблицу через script component в режиме Destination
и запись пар ID в выходной поток.
собственно по insert на каждую запись получается. Не комильфо...

Еще вариант в новой таблице добавить колонку Old_Id !!!!!!!!!
3 апр 12, 19:47    [12360144]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение пакета (integration Servises), как получить identity из предыдущего потока?  [new]
OLEDB Command
Guest
Dzianis
пока альтернативой является вставка значений в таблицу через script component в режиме Destination
и запись пар ID в выходной поток.
собственно по insert на каждую запись получается. Не комильфо...

а разве у Destination есть выходной поток, это уже Transfarmation.


ps
возможно получится воспользоваться OLEDB Command и в output выводит еще и id, но не факт что это будет быстрее script component, т.к. в script component, вы можете собрать пачку данных, а тут только по одной записи
3 апр 12, 19:55    [12360180]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение пакета (integration Servises), как получить identity из предыдущего потока?  [new]
Dzianis
Member

Откуда:
Сообщений: 81
Ivan Durak
Еще вариант в новой таблице добавить колонку Old_Id !!!!!!!!!


О! Минск на проводе :)

Завтра проверю этот вариант. Хотя корректировка структур базы не нравится, может боком выйти при параллельном запуске нескольких пакетов.
3 апр 12, 19:55    [12360181]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение пакета (integration Servises), как получить identity из предыдущего потока?  [new]
Dzianis
Member

Откуда:
Сообщений: 81
Появилась еще одна мысля.
если ID - int (и прирост +1)
то
1) сдвинуть счетчик инкрементности в таблице на нужное число записей
2) вручную присвоить записям нужный новый ID на основе max(id)+1
3) вставить в таблицу с нужными ID
3 апр 12, 20:04    [12360233]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение пакета (integration Servises), как получить identity из предыдущего потока?  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3754
Dzianis
Появилась еще одна мысля.
если ID - int (и прирост +1)
то
1) сдвинуть счетчик инкрементности в таблице на нужное число записей
2) вручную присвоить записям нужный новый ID на основе max(id)+1
3) вставить в таблицу с нужными ID

кстати напомню (или подскажу) что SSIS умеет вставлять и в режиме Identity_Insert ON! То есть структуру таблицы можно скопировать полностью включая и Identity колонку!
4 апр 12, 11:20    [12362719]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение пакета (integration Servises), как получить identity из предыдущего потока?  [new]
Dzianis
Member

Откуда:
Сообщений: 81
Ivan Durak
кстати напомню (или подскажу) что SSIS умеет вставлять и в режиме Identity_Insert ON! То есть структуру таблицы можно скопировать полностью включая и Identity колонку!

Вкурсе.
Это не вариант. В базу (таблицу назначения) будут копироваться данные из многих баз источников, то есть ID=1 будет повторяться много много раз.
4 апр 12, 11:28    [12362777]     Ответить | Цитировать Сообщить модератору
 Re: Выполнение пакета (integration Servises), как получить identity из предыдущего потока?  [new]
Dzianis
Member

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

просто подведу итог, тех решений что сейчас в голове:
1) через script component (или command) инсертить каждую запись в таблицу ручками и формировать выходной поток старые/новые ID (вставка идет по записи, то есть падение скорости)
2) сдвигать по количеству записей счетчик инкрементности в таблице назначения, вручную присваивать каждой записи ID из свободного промежутка и инсертить поток в таблицу с уже готовыми ID (лишь бы в расчете не промахнуться)
3) к ставке добавить поле old_id в таблицу, потом взять поток старые/новые ID из базы, а поле удалить. (главное чтобы 2 пакета не попытались одновременно работать с реальной таблицей или имя поля генерить случайным образом :))
4 апр 12, 13:00    [12363547]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить