Подготовка к запросу информации об изменениях данных
Область применения: среда выполнения интеграции SSIS SQL Server в Фабрика данных Azure
В потоке управления пакета служб Integration Services, который выполняет добавочную загрузку измененных данных, третья и последняя задача состоит в том, чтобы подготовить запрос для измененных данных и добавить задачу потока данных.
Примечание.
Вторая задача для потока управления — убедиться, что измененные данные для выбранного интервала готовы. Дополнительные сведения об этой задаче см. в разделе Определение готовности информации об изменениях данных. Описание общего процесса по проектированию потока управления см. в разделе Система отслеживания измененных данных (SSIS).
Вопросы проектирования
Чтобы получить измененные данные, нужно вызвать возвращающую табличное значение функцию Transact-SQL, которая принимает конечные точки интервала в качестве входных параметров и возвращает измененные данные за указанный период. Эту функцию вызывает исходный компонент в потоке данных. Сведения об этом исходном компоненте см. в разделе Получение и интерпретация измененных данных.
Чаще всего используемые исходные компоненты служб Integration Services, включая источник OLE DB, источник ADO и источник ADO NET, не могут получить сведения о параметрах для функции с табличным значением. Следовательно, в большинстве своем источники не могут вызывать параметризованные функции напрямую.
Существует два конструкторских решения проблемы передачи входных параметров для такой функции.
Сборка параметризированного запроса в виде строки. Чтобы собрать динамическую строку SQL со значениями параметров, жестко запрограммированными в эту строку, можно использовать задачу «Скрипт» или «Выполнение SQL». Затем эту строку можно сохранить в переменной пакета и использовать для задания исходному компоненту свойства SqlCommand. Этот подход приводит к успеху, так как исходный компонент более не требует сведений о параметрах.
Примечание.
Выполнение предварительно скомпилированных скриптов требует меньше ресурсов, чем использование задачи «Выполнение SQL».
Использование параметризованной оболочки. В качестве альтернативы можно создать параметризованную хранимую процедуру как оболочку, которая вызывает параметризованную функцию с табличным значением. Этот подход приводит к успеху, так как исходный компонент может успешно получать сведения о параметрах для хранимой процедуры.
В данном разделе используется первое конструкторское решение и создается параметризированный запрос в виде строки.
Подготовка запроса
Чтобы получить возможность объединения входных параметров в единую строку запроса, пользователь должен настроить переменные пакета, необходимые для этого запроса.
Настройка переменных пакета
В SQL Server Data Tools (SSDT) откройте окно Переменные и создайте переменную со строковым типом данных, в которую будет сохранена полученная от задачи "Выполнение SQL" строка запроса.
В этом примере используется имя переменной SqlDataQuery.
После создания переменной пакета можно объединять значения входных параметров с помощью задачи «Скрипт» или «Выполнение SQL». В следующих двух процедурах описывается настройка этих компонентов.
Использование задачи «Скрипт» для объединения строки запроса
На вкладке Поток управления добавьте к пакету задачу «Скрипт» после контейнера «цикл по элементам» и соедините контейнер с этой задачей.
Примечание.
Здесь предполагается, что пакет выполняет добавочную загрузку из одной таблицы. Если пакет загружает данные из нескольких таблиц и содержит родительский пакет с несколькими дочерними, то эту задачу следует добавить в качестве первого компонента каждого из дочерних пакетов. Дополнительные сведения см. в разделе Выполнение добавочной загрузки нескольких таблиц.
В окне Редактор задачи «Скрипт»на странице Скрипт выберите следующие параметры.
Для свойства ReadOnlyVariablesвыберите из списка значения User::DataReady, User::ExtractStartTimeи User::ExtractEndTime .
Для свойства ReadWriteVariablesвыберите из списка значение User::SqlDataQuery.
В окне Редактор задачи «Скрипт»на странице Скрипт нажмите кнопку Изменить скрипт , чтобы открыть среду разработки скриптов.
В главной процедуре введите один из следующих сегментов кода.
При программировании на языке C# введите следующие строки кода:
int dataReady; System.DateTime extractStartTime; System.DateTime extractEndTime; string sqlDataQuery; dataReady = (int)Dts.Variables["DataReady"].Value; extractStartTime = (System.DateTime)Dts.Variables["ExtractStartTime"].Value; extractEndTime = (System.DateTime)Dts.Variables["ExtractEndTime"].Value; if (dataReady == 2) { sqlDataQuery = "SELECT * FROM CDCSample.uf_Customer('" + string.Format("{0:yyyy-MM-dd hh:mm:ss}", extractStartTime) + "', '" + string.Format("{0:yyyy-MM-dd hh:mm:ss}", extractEndTime) + "')"; } else { sqlDataQuery = "SELECT * FROM CDCSample.uf_Customer(null" + ", '" + string.Format("{0:yyyy-MM-dd hh:mm:ss}", extractEndTime) + "')"; } Dts.Variables["SqlDataQuery"].Value = sqlDataQuery;
- или -
Если вы используете язык Visual Basic, введите следующие строки кода:
Dim dataReady As Integer Dim extractStartTime As Date Dim extractEndTime As Date Dim sqlDataQuery As String dataReady = CType(Dts.Variables("DataReady").Value, Integer) extractStartTime = CType(Dts.Variables("ExtractStartTime").Value, Date) extractEndTime = CType(Dts.Variables("ExtractEndTime").Value, Date) If dataReady = 2 Then sqlDataQuery = "SELECT * FROM CDCSample.uf_Customer('" & _ String.Format("{0:yyyy-MM-dd hh:mm:ss}", extractStartTime) & _ "', '" & _ String.Format("{0:yyyy-MM-dd hh:mm:ss}", extractEndTime) & _ "')" Else sqlDataQuery = "SELECT * FROM CDCSample.uf_Customer(null" & _ ", '" & _ String.Format("{0:yyyy-MM-dd hh:mm:ss}", extractEndTime) & _ "')" End If Dts.Variables("SqlDataQuery").Value = sqlDataQuery
Оставьте без изменений создаваемую по умолчанию строку кода, которая возвращает DtsExecResult.Success в результате выполнения скрипта.
Закройте среду разработки скриптов и Редактор задачи «Скрипт».
Использование задачи «Выполнение SQL» для объединения строки запроса
На вкладке Поток управления добавьте к пакету задачу «Выполнение SQL» после контейнера «цикл по элементам» и соедините контейнер с этой задачей.
Примечание.
Здесь предполагается, что пакет выполняет добавочную загрузку из одной таблицы. Если пакет загружает данные из нескольких таблиц и содержит родительский пакет с несколькими дочерними, то эту задачу следует добавить в качестве первого компонента каждого из дочерних пакетов. Дополнительные сведения см. в разделе Выполнение добавочной загрузки нескольких таблиц.
В окне Редактор задачи «Выполнение SQL»на странице Общие выберите следующие параметры:
Для параметра ResultSetвыберите значение Одна строка.
Настройте допустимое соединение с базой данных-источником.
Для параметра SQLSourceTypeвыберите значение Прямой ввод.
В поле SQLStatementвведите приведенную ниже инструкцию SQL:
declare @ExtractStartTime datetime, @ExtractEndTime datetime, @DataReady int select @DataReady = ?, @ExtractStartTime = ?, @ExtractEndTime = ? if @DataReady = 2 select N'select * from CDCSample.uf_Customer' + N'('''+ convert(nvarchar(30),@ExtractStartTime,120) + ''', ''' + convert(nvarchar(30),@ExtractEndTime,120) + ''') ' as SqlDataQuery else select N'select * from CDCSample.uf_Customer' + N'(null, ''' + convert(nvarchar(30),@ExtractEndTime,120) + ''') ' as SqlDataQuery
Примечание.
Предложение else в этом образце формирует запрос на первоначальную загрузку информации об изменениях, передавая значение NULL для даты и времени начала. Этот образец не учитывает случай, когда изменения, сделанные до включения системы отслеживания измененных данных, тоже необходимо загрузить в хранилище данных.
На странице Сопоставление параметров средства Редактор задачи «Выполнение SQL»выполните следующее сопоставление.
Сопоставьте переменную DataReady с параметром 0.
Сопоставьте переменную ExtractStartTime с параметром 1.
Сопоставьте переменную ExtractEndTime с параметром 2.
На странице Результирующий набор средства Редактор задачи «Выполнение SQL»сопоставьте столбец «Имя результата» с переменной SqlDataQuery.
Имя результата — это имя единственного возвращаемого столбца SqlDataQuery.
Предшествующие процедуры настраивают задачу, которая готовит строку запроса с жестко запрограммированными строковыми значениями для входных параметров. Следующий код представляет собой пример такой строки запроса:
select * from CDCSample. uf_Customer('2007-06-11 14:21:58', '2007-06-12 14:21:58')
Добавление задачи потока данных
Последний этап процесса разработки потока управления для пакета — добавление задачи потока данных.
Добавление задачи потока данных и завершение формирования потока управления
- На вкладке Поток управления добавьте задачу потока данных и соедините с задачей, которая объединяла строку запроса.
Следующий шаг
Завершив подготовку строки запроса и настройку задачи потока данных, приступайте к следующему шагу — созданию функции с табличным значением для получения измененных данных из базы данных.
Следующий раздел: создание функции для получения измененных данных