Обновить таблицу с помощью SSIS

Я пытаюсь обновить поле в таблице данными из другой таблицы на основе общего ключа. Если бы это был прямой SQL, это было бы что-то вроде:

Update EHSIT
set e.IDMSObjID = s.IDMSObjID
from EHSIT e, EHSIDMS s
where e.SITENUM = s.SITE_CODE

Однако две таблицы не находятся в одной базе данных, поэтому я пытаюсь использовать SSIS для обновления. О, и sitenum/site_code — это varchar в одном и nvarchar в другом, поэтому мне придется выполнить преобразование данных, чтобы они совпадали.

Как мне это сделать?
У меня есть объект потока данных с источником как EHSIDMS и назначением как EHSIT. У меня есть преобразование данных для преобразования юникода в не-юникод. Но как обновить на основе совпадения? Я пробовал с местом назначения, используя команду SQL в качестве режима доступа к данным, но, похоже, у него нет исходной таблицы. Если я просто сопоставляю поле для обновления, как оно ограничивает его на основе совпадения полей?

Я собираюсь экспортировать свою исходную таблицу в Excel или что-то в этом роде, а затем попробовать ввести оттуда, хотя кажется, что все, что мне нужно, это удалить шаг преобразования данных.

Разве не должна быть задача обновления данных или что-то в этом роде? Это одна из тех задач преобразования потока данных, и я просто не понимаю, какая именно?


person thursdaysgeek    schedule 18.05.2009    source источник


Ответы (4)


Вы можете использовать SQLCommand (с параметрами), но фактически вы будете писать UPDATE для каждой строки. Я обнаружил, что лучше написать промежуточную таблицу на стороне назначения (либо все данные с удаленной стороны, либо данные, определенные SSIS для изменения) и использовать один SQL UPDATE для выполнения обновления.

person Cade Roux    schedule 18.05.2009
comment
Хорошо, это работает. Я создал временную таблицу в своей базе данных назначения, скопировал в нее данные, а затем использовал оператор обновления, чтобы заполнить одно поле. Удалите временную таблицу, и все готово. Спасибо. - person thursdaysgeek; 19.05.2009
comment
Старайтесь всегда использовать промежуточную таблицу, старайтесь мыслить блоками данных. Если у вас есть 1 миллион записей, которые необходимо обновить, очень медленно обновлять каждую запись с помощью оператора обновления. Поэтому вы должны использовать 1 единственную таблицу и инструкцию для обновления. - person JSC; 29.05.2009

Вы всегда можете использовать полное имя базы данных.

UPDATE server1.databasename.EHSIT
SET E.IDMSOBJID = S.IDMSOBJID
FROM server1.databasename.EHSIT E, server2.databasename.EHSIDMS S
WHERE E.SITENUM = S.SITE_CODE



[serverpath].[database].[databaseobject]
person D3vtr0n    schedule 08.06.2009

Я обнаружил, что использование медленно меняющегося измерения с бизнес-ключом в качестве значения, которое вы сопоставляете, и другими атрибутами, которые вы хотите обновлять по мере изменения значений, кажется, работает.

Devtron, я пробовал это и получаю ошибки о пути к серверу, в нем много /. Мне также сказали, что на это смотрят свысока, особенно если это операция, которая проводится часто.

person Pieces    schedule 10.06.2010
comment
Медленное изменение размеров выполнит свою работу, но ОЧЕНЬ медленно работает с большими объемами данных (из-за того, что он выполняет действия построчно - см. комментарий АО выше) - person Ivan Peevski; 10.10.2011
comment
Смотрел свысока? Думаю, нет. Используя мой пример UPDATE, вам даже не нужен SSIS для выполнения транзакции. Это также зависит от настройки вашей сети и конфигурации связанной базы данных. - person D3vtr0n; 14.11.2012

Я бы использовал преобразование поиска Нет необходимости в подготовке — нет необходимости писать Код SQL — именно таким должен был быть SSIS!

person BIDeveloper    schedule 14.04.2016