SSIS - Как использовать набор результатов в качестве входных данных в задаче SQL и правильно определить типы данных? - PullRequest
2 голосов
/ 19 мая 2010

Я пытаюсь объединить записи из таблицы базы данных Oracle с моей локальной таблицей SQL.

У меня есть переменная для пакета, которая является объектом, называемая OWell.

У меня есть задача потока данных, которая получает данные Oracle в виде статистики SQL (выберите well_id, well_name из порядка OWell по Well_ID), а затем задачу преобразования для преобразования well_id из DT_STR длиной 15 в DT_WSTR; и преобразуйте well_name из DT_STR длиной 15 в DT_WSTR длиной 50. Затем он сохраняется в наборе записей OWell.

Причиной преобразований является то, что таблица, в которую я хочу добавить записи, имеет поле идентификации: SSIS показывает well_id в виде DT_WSTR длиной 15, well_name - DT_WSTR длины 50.

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

Insert into WELL (WELL_ID, WELL_NAME)
Select OWELL_ID, OWELL_NAME
from OWell
where OWELL_ID not in 
   (select WELL.WELL_ID from WELL)

Для отображения параметров у меня есть параметр 0, называемый OWell_ID, из моей переменной User :: OWell. Параметр 1, называемый OWell_Name, принадлежит той же переменной. Оба настроены на VARCHAR, хотя я также пробовал NVARCHAR. У меня нет набора результатов.

Я получаю следующую ошибку: Ошибка: 0xC002F210 при вставке записей в FLEDG, задача «Выполнение SQL»: выполнение запроса «Вставить в WELL» (WELL_ID, WELL_NAME) Выбрать OWELL ... "не удалось, возникла следующая ошибка:" Произошла ошибка при извлечении результата в переменную типа (DBTYPE_STR) ". Возможные причины сбоя: проблемы с запросом, свойство ResultSet установлено неправильно, параметры не установлены правильно, или соединение установлено неправильно.

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

Ответы [ 2 ]

2 голосов
/ 20 мая 2010

Ваша проблема в том, что вы пытаетесь прочитать переменную объекта в задачу sql и обратиться к этой переменной в задаче sql.

Чтобы сделать то, что вы пытаетесь сделать, вы можете использовать задачу цикла foreach. Вы можете установить для каждого перечислителя a переменную объекта (набора записей) и сопоставить ее столбцы с переменными, которые затем можно будет передать в качестве параметров в задачу sql. Ваш SQL-код в приведенном выше примере имеет еще один недостаток: вы пытаетесь ссылаться на переменную в вашем пакете, как если бы она была таблицей в вашей базе данных. Вы должны изменить свой sql на что-то вроде Insert into well(?,?)

Однако этот подход не учитывает этап, на котором вы можете проверить, существуют ли записи, прежде чем вставить их. Лучшим общим подходом было бы сделать все это в потоке данных.

Делайте все, что вы делаете, по своему выбору из потока данных Oracle. На последнем шаге вместо использования назначения набора записей, указывающего на переменную USER :: OWell, добавьте поиск из локальной таблицы sql. Установите в своем выражении sql значение select WELL.WELL_ID from WELL. На вкладке столбцов в вашем поиске сопоставьте Well_ID из вашего потока данных (поля слева) с Well_ID из вашего поиска (поля справа), перетащив поле well_id слева направо, чтобы сформировать соединитель между полями. В нижней части диалогового окна нажмите «Настроить вывод ошибок» и задайте значение столбца ошибок для строки выходных данных поиска «Перенаправить строку». Нажмите OK, чтобы сохранить и закрыть этот поиск. Затем добавьте пункт назначения oledb в поток данных и подключите его к выходу ошибки поиска (красная стрелка). Укажите пункт назначения для таблицы sql и сопоставьте столбцы из потока данных с соответствующими столбцами в выходной таблице. Это передаст строки из потока данных Oracle, которые не существуют в таблице SQL, в массовую вставку таблицы SQL.

1 голос
/ 19 мая 2010

Чтобы вывести пропущенные строки, мы либо использовали задачу поиска, а затем направили найденные строки в обычное место назначения OLEDB (очевидно, вы не предоставляете столбец идентификаторов) или (где мы сравнивали всю таблицу) SQLBI.com TableDifference компонент и направил новые строки в аналогичный пункт назначения OLEDB.

Отдельные вставки в задаче «Команда SQL» не очень быстрые.

...