2015-02-24 3 views
1

Короче говоря: Можно ли вызвать хранимую процедуру с параметром вывода в потоке данных?Вызов хранимой процедуры из потока данных SSIS

Продолжительность: У меня есть много таблиц для извлечения, преобразования и загрузки с одного db на другой. Для почти всех таблиц требуется одно преобразование, которое фиксирует коды стран (от 3 до двух). Поэтому моя идея такова: для каждой строки: вызов хранимой процедуры, передача неправильного кода страны, замена неправильного кода на правильный (выход хранимой процедуры)

+0

То, как я это сделаю, помещает данные в промежуточную таблицу и выполняет массовое обновление. Если вы не хотите этого делать, вы можете использовать компонент поиска. Почему преобразование в хранимой процедуре? Разве это не простой поиск? –

ответ

0

Да, вы можете. Для этого вам нужно использовать пару Execute SQL Tasks.

  1. Используйте SQL-задачу Execute для сбора набора результатов из Wrong_Country_Code.
  2. Добавьте контейнер ForEach в качестве преемника предыдущей задачи выполнения SQL. Передайте результат в этот контейнер.
  3. Внутри контейнера ForEach у вас будет еще одна задача SQL Execute, которая будет вызывать ваш sproc, используя каждую строку (например, Wrong_Country_Code) в качестве параметра переменной.

Это должно сработать. Выберите только столбцы, необходимые для перехода к хранимой процедуре.

Редактировать

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

+0

Как отмечает @billinkc, здесь стоит отметить эффективность, которая должна быть отмечена. – sorrell

+0

Это очень верно, я добавил редактирование. @billinkc прав о родном компоненте, мой ответ - это больше похожее решение, которое должно работать, с несколькими важными соображениями. – Phoenix

2

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

Что вы описываете - это поиск. Задача потока данных имеет компонент Lookup, но вам будет лучше обслуживаться, особенно для конечного списка значений, таких как страны, чтобы указать ваш запрос в компонент.

SELECT T.Country3, T.Country2 FROM dbo.Table T;

Затем вы перетащите столбец SourceCountry и сопоставьте его с Country3. Проверьте Country2 и для всех строк, которые соответствуют, вы получите 2-буквенную аббревиатуру.

Недостаток использования вашей хранимой процедуры - эффективность. По умолчанию Lookup будет кэшировать все эти значения. С версией скрипта, скажем, у вас есть 10k строк, все с CAN. Это 10k-запросов вашей хранимой процедуры, где результаты никогда не меняются.

Вы оплачиваете начальную стоимость, поскольку режим поиска по умолчанию - это полный кэш, что означает, что он выполнит ваш запрос и сохранит все эти значения локально. Это отлично с вашим набором данных: 1000 стран максимум, 5 или 10 байт за строку. Это ничего.

4

Есть по крайней мере два решения для этого:

  • Look-Up компонента: настроив его в заранее режиме и убедитесь, что последнее предложение SProc является Выберите утверждение, которое возвращает код хорошо стран (например,ВЫБОР @good_country_code)
  • Использование OLEDB команды

Последние (OLEDB Command) на самом деле очень просто, вам нужно настроить его:

EXEC ? = dbo.StoredProc @param1 = ?, @param2 = ? 

Как следствие появится @RETURN_VALUE в доступных столбцах назначения, которые затем можно сопоставить с существующим столбцом в конвейере. Не забудьте создать новое поле/столбец конвейера (например, Good_Country_Code) с использованием компонента Derived Column перед компонентом OLEDB, и у вас будет возможность иметь оба значения или заменить неправильный, используя другой компонент Derived Column после команды OLEDB.

+0

Спасибо за ответ. Я нашел команду OLE DB полезной, когда для некоторых краевых случаев, где мне нужно вызвать SP. Эта ссылка - http://goo.gl/KefX0N дает подробное объяснение. – Karthik

+0

Хорошее объяснение по этой ссылке Karthik –

Смежные вопросы