Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 ssis dataflow task - с каждым рядом - вызвать хранимку и рез-т добавить как нов. кол  [new]
McCar
Member

Откуда: Саратов
Сообщений: 775
Народ, подскажите плиз как выполнить черех SSIS 2005 такое...
Есть поток данных в data flow task, - нужно с каждым рядом из этого потока выполнить некую хранимую процедуру
(
select store from spv_ware_def_store(?,?)
)
, и результат (или результаты) этой хранимки добавить к потоку данных как новые колонки.
Я так думал что для этого предназначено "OLE DB Command". Но как из него использовать результат хранимки?
Или это черех LOOKUP transformation? Но там не понятно как передавать в эту хранимку параметры..
14 сен 09, 10:34    [7653855]     Ответить | Цитировать Сообщить модератору
 Re: ssis dataflow task - с каждым рядом - вызвать хранимку и рез-т добавить как нов. кол  [new]
Glory
Member

Откуда:
Сообщений: 104760
select из процедуры сделать невозможно
14 сен 09, 10:37    [7653870]     Ответить | Цитировать Сообщить модератору
 Re: ssis dataflow task - с каждым рядом - вызвать хранимку и рез-т добавить как нов. кол  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
Вкладка Component Properties, где SqlCommand пишите EXEC dbo.sp_tmp ?
14 сен 09, 10:47    [7653922]     Ответить | Цитировать Сообщить модератору
 Re: ssis dataflow task - с каждым рядом - вызвать хранимку и рез-т добавить как нов. кол  [new]
McCar
Member

Откуда: Саратов
Сообщений: 775
Glory
select из процедуры сделать невозможно

Прошу прощения, забыл уточнить, речь идет о FireBird а не о MSSQL.
14 сен 09, 10:49    [7653935]     Ответить | Цитировать Сообщить модератору
 Re: ssis dataflow task - с каждым рядом - вызвать хранимку и рез-т добавить как нов. кол  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
Это когда на входе OLE DB Source и OLE DB Command исполняет над каждой строчкой ХП.
Результат работы этой ХП добавить как новые колонки нельзя. Можно перебиться временными таблицами.
14 сен 09, 10:50    [7653940]     Ответить | Цитировать Сообщить модератору
 Re: ssis dataflow task - с каждым рядом - вызвать хранимку и рез-т добавить как нов. кол  [new]
McCar
Member

Откуда: Саратов
Сообщений: 775
--__Александр__--
Вкладка Component Properties, где SqlCommand пишите EXEC dbo.sp_tmp ?

Это - FireBird, он не знает слово EXEC.
Хранимая процедура здесь - скорее что то вроде табличной функции в MSSQL.
14 сен 09, 10:56    [7653966]     Ответить | Цитировать Сообщить модератору
 Re: ssis dataflow task - с каждым рядом - вызвать хранимку и рез-т добавить как нов. кол  [new]
McCar
Member

Откуда: Саратов
Сообщений: 775
--__Александр__--
Это когда на входе OLE DB Source и OLE DB Command исполняет над каждой строчкой ХП.
Результат работы этой ХП добавить как новые колонки нельзя. Можно перебиться временными таблицами.

Хм.. вроде задача стандартная? неужели никак нельзя? (ну понятно что скриптам можно все что угодно).
Может я не правильно сформулировал...
Еще раз, без привязки к хранимкам и FireBird, пусть речь идет о MSSQL - допустим есть поток данных и нужно к потоку данных добавить колонку с синусом по одной колонке-
select sin(?).
Можно такую задачу реализовать?
14 сен 09, 11:08    [7654043]     Ответить | Цитировать Сообщить модератору
 Re: ssis dataflow task - с каждым рядом - вызвать хранимку и рез-т добавить как нов. кол  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
А, наврал, можно соединить ))
1) пишите в OLE DB Command свой select * from sp ?,?
2) Дальше от OLE DB Command тяните стрелочку к Union All/Merge Join/Merge
3) Так же к Union All/Merge Join/Merge тяните стрелочку от другого потока, который вам нужно соединить.
14 сен 09, 11:09    [7654061]     Ответить | Цитировать Сообщить модератору
 Re: ssis dataflow task - с каждым рядом - вызвать хранимку и рез-т добавить как нов. кол  [new]
McCar
Member

Откуда: Саратов
Сообщений: 775
--__Александр__--
А, наврал, можно соединить ))
1) пишите в OLE DB Command свой select * from sp ?,?
2) Дальше от OLE DB Command тяните стрелочку к Union All/Merge Join/Merge
3) Так же к Union All/Merge Join/Merge тяните стрелочку от другого потока, который вам нужно соединить.

Прошу прощения, чет опять не понял.
Сейчас у меня проблема в том что я не могу понять как получить что то на выходе OLE DB Command.
Допустим, пишу что то вроде
select max(SalesAmount) from dbo.FactInternetSales where OrderQuantity>?
в SQL command. Проставляю маппинг параметра и колонки.
Дальше иду на закладку "Input and Output Properties", хочу на выходе увидеть колонку со значениями max(SalesAmount).
Жму на "OutPut Columns" "Add Column"
Получаю ошибку -

... The component does not allow adding columns to this input or output.

Что не так делаю?
14 сен 09, 11:30    [7654184]     Ответить | Цитировать Сообщить модератору
 Re: ssis dataflow task - с каждым рядом - вызвать хранимку и рез-т добавить как нов. кол  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
Вот тут почитайте:
http://social.msdn.microsoft.com/forums/en-US/sqlintegrationservices/thread/ee686cf8-0880-4a1d-8706-ba72fbb2eba8/
Ну или как здесь:
http://stackoverflow.com/questions/487366/ssis-return-value-of-stored-procedure-within-an-ole-db-command
14 сен 09, 12:28    [7654588]     Ответить | Цитировать Сообщить модератору
 Re: ssis dataflow task - с каждым рядом - вызвать хранимку и рез-т добавить как нов. кол  [new]
somebody
Member

Откуда: Москва
Сообщений: 708
автор
Я так думал что для этого предназначено "OLE DB Command". Но как из него использовать результат хранимки?

Добавьте destination, на него протяните стрелочку из ole db command, сделайте нужные сопоставления полей, тогда результат sql command уйдёт в destination.

автор
и результат (или результаты) этой хранимки добавить к потоку данных как новые колонки.

Если надо к той же таблице добавить новые столбцы, сделайте временную таблицу как destination, и потом из неё добавляйте в отдельном task'е.
15 сен 09, 11:50    [7659824]     Ответить | Цитировать Сообщить модератору
 Re: ssis dataflow task - с каждым рядом - вызвать хранимку и рез-т добавить как нов. кол  [new]
somebody
Member

Откуда: Москва
Сообщений: 708
А, нет, ошибочка. Так sqlcommand не вернёт результат...
15 сен 09, 12:02    [7659943]     Ответить | Цитировать Сообщить модератору
 Re: ssis dataflow task - с каждым рядом - вызвать хранимку и рез-т добавить как нов. кол  [new]
--__Александр__--
Member

Откуда:
Сообщений: 2631
somebody
А, нет, ошибочка. Так sqlcommand не вернёт результат...


Как сделать, что бы ole db command вернул результаты написано в приведенных мною ссылках.
15 сен 09, 12:13    [7660047]     Ответить | Цитировать Сообщить модератору
 Re: ssis dataflow task - с каждым рядом - вызвать хранимку и рез-т добавить как нов. кол  [new]
somebody
Member

Откуда: Москва
Сообщений: 708
В общем, думаю так.
Создать табличку, скажем, temp, содержащую нужный столбец и ключевые поля.
В ole db command указать SqlCommand = "INSERT INTO temp EXECUTE <хранимка> ? ? ..."
(В хранимке должен быть возвращающий select).
Ну и потом по ключевым полям проставляем значение нового столбца из temp.
15 сен 09, 12:38    [7660303]     Ответить | Цитировать Сообщить модератору
 Re: ssis dataflow task - с каждым рядом - вызвать хранимку и рез-т добавить как нов. кол  [new]
McCar
Member

Откуда: Саратов
Сообщений: 775
--__Александр__--
Вот тут почитайте:
http://social.msdn.microsoft.com/forums/en-US/sqlintegrationservices/thread/ee686cf8-0880-4a1d-8706-ba72fbb2eba8/
Ну или как здесь:
http://stackoverflow.com/questions/487366/ssis-return-value-of-stored-procedure-within-an-ole-db-command

Пока не помогло.
Похоже что SSIS плохо понимает синтаксис вызова хранимки в Firebird.
- там вместо "exec" используется EXECUTE PROCEDURE.
Но, когда ему пишешь в slq command
execute procedure SPV_WARE_TYPE(?,?)
- он ругается что "There is a data source column with no name".
А если, как рекомендовано по первой ссылке, прописать в начале хранимки такую фигню
IF (1 = 0) then begin
SELECT CAST(1 as integer) as Fake from rdb$database into :C_MODEL ;
-- Publish metadata
end
тогда он (SSIS) как бы начинает видеть выходной параметр, но говорит что "There is more then one data source column with the name С_WARE_TYPE".
В общем то слепота, то в глазах двоится (С_WARE_TYPE это выходной параметр хранимой процедуры).

Вариант что сначала в временную табличную переменную тоже не прокатывает - в FireBird нет табличных переменных, в временную таблицу записывать -может и можно но не стал пытаться, слишком уж через-анальный путь.
Придется наверно черех скрипт делать..
16 сен 09, 19:39    [7669925]     Ответить | Цитировать Сообщить модератору
 Re: ssis dataflow task - с каждым рядом - вызвать хранимку и рез-т добавить как нов. кол  [new]
McCar
Member

Откуда: Саратов
Сообщений: 775
И все же, уже вне первоначального вопроса по поводу хранимок,
можно ли в SSIS пакете такой сценарий реализовать...
Есть некий DataFlowTask, - нужно для каждого ряда из pipeline вызвать параметризированный SELECT запрос, и его результат обрабатывать уже как паралельный pipeline.
Буду рад если это окажется из разряда RTFM, но несколько заходов прогугливания и рассматривания компонентнов из "DataFlowTransformations" не дали мне подходящих примеров.
?
21 сен 09, 12:42    [7686531]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить