ETL-процесс с использованием веб-сервисов в Integration Services 2012Источник: habrahabr Alex509
Запасаем впрокИногда в процессе работы бывают нужны данные из веб-сервисов, тем более SOAP соединения сегодня практически стандарт. ETL-процесс (Extract - Transform - Load) это термин из Business Intelligence и описывает процесс сбора и трансформации данных для создания аналитической базы данных (например хранилища данных). SOAP протокол обмена данных и веб-сервисы описываемые WSDL - распространенные окна в мир практически всех ERP систем, многих онлайн порталов и финансовых организаций. Попробую описать пошагово ETL процесс с помощью одного из мощнейших инструментов в классе - MS Integration Services. Итак, рассмотрим тестовую задачу.
ЗадачаНеобходимо собрать данные о курсах валют по отношению к рублю на каждую дату прошлого года и загрузить их в таблицу для последующего анализа. Центробанк России предоставляет историчекие данные - в виде веб сервисов с неплохим описанием. Создаем проектДля начала создадим проект в Business Intelligence Development Studio (А с недавних пор - SQL Server Data Tools) Во тулбоксе есть элемент Web-service-task, его мы и перенесем на рабочую область. В строке HttpConnection создадим новое соединение - выбрав NewConnection WSDL - файл доступен там-же, вот он www.cbr.ru/DailyInfoWebServ/DailyInfo.asmx?WSDL Все, переходим во вкладку Input
Тут можно выбрать среди сервисов и их методов - поставляемых провайдером.
Запустим процесс - дело пошло. Файл создается - курсы валют выгялядят как курсы валют. В BI-студии есть XML-Source коннектор - он выдает нулевой результат при попытке натравить его на такой файл. (Схему считывает). Поставим после Web Service Task - Skript Task.
Workaround
Скрытый текст
Скрипт на C#, можно использовать весь инструментарий .net платформы и 2012 VisualStudio. На выходе чистый XML - благодаря acceptChanges();
Reconsidering the BeginningНеплохо было бы брать диапазон дат - и получать для каждой курсы валют, а потом записывать, дополнив курсы полем дата, в базу данных. Для начала создадим временное измерение, оно пригодится и еще не раз - в каждом хранилище данных. Я создаю своей вариацией подсмотенного в сети скрипта, вот он.
Скрытый текст
Перенесем на рабочую область новый элемент
Базу TEST и OLE DB соединение localhost.TEST создали попутно. Как заставить процесс брать каждую дату из результата и передавать ее на WebServiceTask. С помощью переменных.
ПеременныеПравый щелчок на рабочей области - Variables. Или меню View - Other Windows - Variables. Это очень мощный инструмент, но мы упомянем его лишь вскользь, без него SSIS не могут и половины заявленного.
Теперь добавим последовательно к SQL-Task Foreach Loop Container. Вот так он настраивается
Созданая нами переменная Date типа Date - будет доступна внутри контейнера - так мы передадим актуальную для записи дату. Вот что мы положим в контейнер
Посмотрим что за DataFlow следует за нашим скриптом - там все просто. Читаем XML с помощью XML - Source,
В элементе Derived Column - вставляем нашу переменную Date - для записи в базу. Вот такой результат получается |