Nano Hash - криптовалюты, майнинг, программирование

Как объединить таблицы в двух разных базах данных во время переноса данных с помощью SSIS

Я пытаюсь перенести данные из базы данных 1 в базу данных 2. В базе данных 1 у меня есть TableA с двумя строками: Product_ID и Product_Num. TableB в базе данных 2 содержит точно такую ​​же информацию, за исключением того, что TableB.Product_ID — это меньшее подмножество TableA.Product_ID, а TableB.Product_Num — все NULL. Мне нужно вставить Product_Num из TableA в Product_Num в TableB только для тех Product_IDs, которые существуют в TableB. Я могу перенести данные с помощью простого оператора SQL, однако для этого проекта все нужно делать с помощью SSIS.

Я настроил задачу потока данных, связывающую источник OLE DB (TableA) с местом назначения OLE DB (TableB), но это все. Я написал команду SQL (SELECT A.Product_Num FROM Database1.DBO.TableA A JOIN Database2.DBO.TableB B ON A.Product_ID = B.Product_ID) в источнике OLE DB и сопоставил ее со столбцом Product_Num в месте назначения OLE DB, но JOIN вызывает некоторые продукты. Любая идея, что я могу сделать? Спасибо.


Ответы:


1

Повторная постановка проблемы

Мне нужно заполнить 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
  • Привет, billinkc, спасибо за быстрый ответ. Я, вероятно, должен был упомянуть, что у меня есть связанный сервер. 24.09.2013
  • Наличие связанного сервера, вероятно, нарушает ваше заявление для этого проекта, все должно быть сделано с использованием SSIS. но это в любом случае бессмысленное требование. 24.09.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..