Академический Документы
Профессиональный Документы
Культура Документы
Abd Lab Ssis
Abd Lab Ssis
Задание
1. Реализовать интеграцию 2 источников данных и
импорт данных в БД.
2. Индивидуальное задание. Реализовать
заполнение БД из альтернативного источника
(таблицы Excel или MySQL Server)
Теоретические сведения
Источник: https://habrahabr.ru/post/330840/
SSIS – это инструмент, который позволяет в удобном виде реализовать
интеграцию, т.е. реализовать процесс переноса данных из одного источника в
другой. Этот процесс иногда называют ETL (от англ. Extract, Transform, Load –
дословно «извлечение, преобразование, загрузка»).
Необходимые инструменты для изучения SSIS
SSIS будет рассматриваться на примере SQL Server 2014 Developer Edition.
Службы Integration Services доступны в SQL Server 2014 начиная с редакции
Standard.
SSDT – это расширение для Visual Studio, которое позволит создавать проекты
необходимого нам типа.
Для облегчения процесса установки, я воспользуюсь SSDT для Visual Studio 2012
(VS2012), его можно скачать по ссылке (файл «SSDTBI_VS2012_x86_ENU.exe»):
www.microsoft.com/en-US/download/details.aspx?id=36843
Так как у меня на компьютере всего один диск, то все директории я оставил по
умолчанию, при необходимости вы можете изменить их на более удобные.
Следующим шагом установим SSDT – это расширение для Visual Studio, которое
даст нам возможность создавать проекты SSIS. Установщик SSDT ставит
минимальную версию оболочки VS, поэтому предварительно устанавливать VS
отдельно нет надобности.
USE DemoSSIS_SourceA
GO
-- продукты из источника A
CREATE TABLE Products(
ID int NOT NULL IDENTITY,
Title nvarchar(50) NOT NULL,
Price money,
CONSTRAINT PK_Products PRIMARY KEY(ID)
)
GO
INSERT Products(ID,Title,Price)VALUES
(1,N'Клей',20),
(2,N'Корректор',NULL),
(3,N'Скотч',100),
(4,N'Стикеры',80),
(5,N'Скрепки',25)
SET IDENTITY_INSERT Products OFF
GO
USE DemoSSIS_SourceB
GO
-- продукты из источника B
CREATE TABLE Products(
ID int NOT NULL IDENTITY,
Title nvarchar(50) NOT NULL,
Price money,
CONSTRAINT PK_Products PRIMARY KEY(ID)
)
GO
INSERT Products(ID,Title,Price)VALUES
(1,N'Ножницы',200),
(2,N'Нож канцелярский',70),
(3,N'Дырокол',220),
(4,N'Степлер',150),
(5,N'Шариковая ручка',15)
USE DemoSSIS_Target
GO
-- принимающая таблица
CREATE TABLE Products(
ID int NOT NULL IDENTITY,
Title nvarchar(50) NOT NULL,
Price money,
SourceID char(1) NOT NULL, -- используется для идентификации источника
SourceProductID int NOT NULL, -- ID в источнике
CONSTRAINT PK_Products PRIMARY KEY(ID),
CONSTRAINT UK_Products UNIQUE(SourceID,SourceProductID),
CONSTRAINT CK_Products_SourceID CHECK(SourceID IN('A','B'))
)
GO
Создадим соединения:
Заполняем параметры соединение с БД:
Data Flow Task – это сложный компонент, который имеет свою область, в
которой создаются вложенные элементы для работы с потоком данных.
Выполним запрос:
USE DemoSSIS_Target
GO
SELECT *
FROM Products
Перейдем в область «Control Flow» и создадим еще один компонент «Data Task
Flow», который назовем «Load Products From Source B», протянем на него
зеленную стрелку от «Load Products From Source A»:
Двойным щелчком зайдем в область «Data Flow» этого элемента и создадим
«Source Assistant»:
SELECT
ID SourceProductID,
'B' SourceID,
Title,
Price
FROM Products
USE DemoSSIS_Target
GO
SELECT *
FROM Products
Теперь при запуске пакета на выполнение в этой точке будет сделана остановка и
нам будут показаны данные этого потока:
Для продолжения выполнения пакета нужно нажать на кнопку со стрелкой
или просто закрыть окно просмотра данных.
Создадим сборку:
Шаг создан:
Так как шаг у нас всего один, то задача запустится сразу, иначе нужно было бы
указать с какого шага нужно начать выполнение.
Результат выполнения задачи можно увидеть в следующем журнале:
1. При помощи компонента «Union All» объединим два входящих потока в один;
2. Для новых записей будем делать вставку, а для записей, которые уже были
добавлены ранее будем делать обновление. Для разделения записей на
добавляемые и обновляемые воспользуемся компонентом Lookup;
3. Для обновления записей применим компонент «OLE DB Command».
В завершении этой части рассмотрим компонент Multicast для того чтобы распараллелить
выходящий набор.
Итого в этой части мы познакомимся с четырьмя новыми компонентами: Union All, Lookup,
OLE DB Command и Multicast.
Двойным щелчком по элементу «Data Flow Task» зайдем в его область «Data Flow».
Создадим два элемента «Source Assistant» для соединений SourceA и SourceB.
Переименуем эти элементы в «Source A» и «Source B» соответственно:
SELECT
ID SourceProductID,
Title,
Price
FROM Products
SELECT
ID SourceProductID,
'B' SourceID,
Title,
Price
FROM Products
Воспользуемся элементом «Union All», чтобы объединить данные из 2-х наборов в один.
Направим в него синие стрелки из «Source A» и «Source B»:
Каким образом делается сопоставление колонок двух входящих наборов, можно увидеть
дважды щелкнув на элементе «Union All»:
Объединение двух наборов в данном случае делается на стороне SSIS. Здесь стоит
обратить внимание на то, что базы источники и принимающая база могут располагаться
на разных серверах/экземплярах SQL Server, по этой причине мы не всегда сможем так
просто написать SQL запрос используя в нем таблицы из разных баз с применением SQL-
операции UNION или JOIN (который можно было использовать вместо Lookup описанного
ниже).
Для того чтобы заменить NULL значения на «A» воспользуемся компонентом «Derived
Column» в который направим поток из «Union All»:
Для того чтобы понять, что произошло с данными после прохождения «Union All»
сделайте «Enable Data Viewer» для стрелки, идущей от «Union All» к «Derived Column»:
Теперь при запуске пакета на выполнение вы сможете увидеть набор, который получился
в результате:
Здесь видно, что на этом этапе (до Derived Column) в колонке SourceID для строк
первого набора стоят значения NULL.
Для того чтобы определить была ли добавлена ранее запись в базу DemoSSIS_Target
воспользуемся компонентом Lookup:
«Full cache» говорит о том, что набор, который будет использоваться в качестве
справочника одним SQL запросом (см.на следующей вкладке) будет полностью загружен
в память и строки будут сопоставляться уже с кэша без повторных обращений к SQL
Server.
Если же выбрать «Partial cache» или «No cache», то на вкладке Advanced можно будет
прописать запрос с параметрами, который будет выполняться для сопоставления каждой
строки входящего набора. Для интереса можно поиграться с этим свойством и через SQL
Server Profiler посмотреть какие будут формироваться запросы при выполнении пакета.
На следующей вкладке нам нужно определить набор, который будет выступать в роли
справочника:
Я прописал здесь запрос:
SELECT
SourceID,
SourceProductID,
ID TargetID
FROM Products
В этот компонент автоматически будет направлен поток «Lookup Match Output», т.к. поток
«Lookup No Match Output» мы уже выбрали ранее:
Дважды щелкнем на «OLE DB Command» и настроим его:
Пропишем следующий запрос на обновление:
UPDATE Products
SET
Title=?,
Price=?
WHERE ID=?
USE DemoSSIS_SourceB
GO
INSERT Products(ID,Title,Price)VALUES
(6,N'Точилка',NULL),
(7,N'Ластик',NULL),
(8,N'Карандаш простой',NULL)
SET IDENTITY_INSERT Products OFF
GO
Для того чтобы отследить как менялись данные, вы можете, перед запуском пакета на
выполнение, в необходимых местах сделать «Enable Data Viewer»:
USE DemoSSIS_Target
GO
IF(EXISTS(
SELECT Title,Price
FROM Products
WHERE ID=@TargetID
EXCEPT
SELECT @Title,@Price
)
)
BEGIN
UPDATE Products
SET
Title=@Title,
Price=@Price,
UpdatedOn=GETDATE()
WHERE ID=@TargetID
END
Так же можно было бы все это оформить в виде хранимой процедуры, а здесь прописать
ее через вызов «EXEC ProcName ?,?,?». Здесь, думаю, кому как удобнее, мне порой
удобнее, чтобы все было прописано в одном месте, т.е. в SSIS-проекте. Но если
использовать процедуру, то тоже получаем свои удобства, в этом случае можно, было бы
просто изменить процедуру и избежать переделки и повторного развертывания SSIS-
проекта.
USE DemoSSIS_SourceA
GO
UPDATE Products
SET
Price=30
WHERE ID=2 -- Корректор
USE DemoSSIS_Target
GO
SELECT *
FROM Products
ORDER BY UpdatedOn DESC
В рамках данной части рассмотрим еще компонент «Multicast». Данный компонент
позволяет получить из одного потока несколько. Это может быть полезно, когда одни и те
же данные необходимо записать в два или более разных мест – т.е. входит один набор, а
выходит столько его копий сколько нам нужно, и с каждой копией этого набора мы можем
делать что захотим.
USE DemoSSIS_Target
GO
Создадим еще один элемент «OLE DB Destination» и перетащим на него вторую синюю
стрелку от элемента Multicast:
Переименуем для наглядности:
USE DemoSSIS_Target
GO
DELETE Products
WHERE SourceID='B'
AND SourceProductID>=6