Повторная постановка проблемы
Мне нужно заполнить Product_Num для всех данных в базе данных2 из соответствующей таблицы в базе данных1.
Менеджеры соединений
Установите соединение OLE DB с Database1
и Database2
Получить данные
Чтобы ваш текущий запрос работал, вам необходимо установить связанный сервер между Database1
и Database2
.
Другой вариант — использовать запрос к Database2
для создания списка всех идентификаторов Product_ID, которым нужны номера.
ВЫБЕРИТЕ A.Product_ID ИЗ dbo.TableA КАК ГДЕ A.Product_Num IS NULL;
Добавьте недостающие данные
Это предполагает, что вы не настроили связанный сервер. Вы использовали термин «Присоединиться» в своем вопросе, и есть Merge Join
, но я не думаю, что он вам понадобится для этого сценария. Вместо этого вас заинтересует файл Lookup Component
. Добавьте один из них после источника OLE DB и настройте его. Используйте диспетчер соединений Database1
(поскольку он содержит необходимые справочные данные). В зависимости от того, является ли это установкой 2005 или 2008+, и существует ли возможность отсутствия соответствия, вам нужно будет иметь дело с несопоставленными объектами. По умолчанию поиск должен найти совпадение для каждой проходящей через него строки. Как правило, я меняю это поведение на Redirect no match output
для экземпляров 2008+ или "игнорировать неудачные поиски" (приблизительно) для 2005 года.
Оставьте его в полном кеше (если только ящику не хватает памяти или исходная таблица слишком велика)
Запрос, который вы хотите написать,
SELECT B.Product_Num, B.Product_ID FROM dbo.TableB AS B;
Соедините [Product_ID] из источника OLE DB (слева) с [Product_ID] в поиске (справа) и проверьте Product_Num.
Обновление данных
На данный момент у вас есть два столбца в потоке данных: Product_ID из B и соответствующий Product_Num из A. Проблема с SSIS заключается в том, что обновлений на самом деле не существует. Службы SSIS предназначены для тяжелых вставок, и в этом они ведут себя как чемпионы. Однако обновления по умолчанию являются одноэлементными операциями. Обновить строку, обновить строку, обновить строку... Сравните это с желаемым подходом на основе набора для вставок (бум добавлено 100000 строк, бум добавлено еще N строк)
Стандартный подход заключается в использовании объекта OLE DB Command и написании там оператора обновления. Для 10, 100, 1000 обновлений это, наверное, ничего. Обновление миллиона строк? Такой подход не будет масштабироваться.
Подход для больших объемов обновлений заключается в том, чтобы использовать SSIS для того, что он делает действительно хорошо (INSERT) для промежуточной таблицы, а затем выполнить шаг постпотока данных UPDATE на основе набора (выполнение задачи SQL) для целевой таблицы из промежуточной таблицы. . Это предполагает, что у вас есть возможность создать таблицу на целевом сервере. На некоторых работах, на которых я работал, это было невозможно.
UPDATE B
SET
Product_Num = S.Product_Num
FROM
Stage.TableC S
INNER JOIN
dbo.TableB B
ON B.Product_ID = S.Product_ID
WHERE
B.Product_Num IS NULL;
23.09.2013