Подготовка к запросу измененных данных
В потоке управления пакета служб Integration Services, который выполняет добавочную загрузку измененных данных, третья и последняя задача состоит в том, чтобы подготовить запрос для измененных данных и добавить задачу потока данных.
Примечание |
---|
Вторая задача для потока управления — убедиться, что измененные данные для выбранного интервала готовы. Дополнительные сведения об этой задаче см. в разделе Определение готовности системы отслеживания измененных данных. Описание общего процесса по проектированию потока управления см. в разделе Повышение эффективности добавочной загрузки с помощью системы отслеживания измененных данных. Законченные полнофункциональные образцы, в которых показано использование отслеживания измененных данных в пакетах, см. в образцах служб Integration Services в разделе Codeplex. |
Вопросы проектирования
Чтобы получить измененные данные, нужно вызвать возвращающую табличное значение функцию Transact-SQL, которая принимает конечные точки интервала в качестве входных параметров и возвращает измененные данные за указанный период. Эту функцию вызывает исходный компонент в потоке данных. Дополнительные сведения об этом исходном компоненте см. в разделе Получение и интерпретация измененных данных.
Чаще всего используемые исходные компоненты служб Integration Services, включая источник OLE DB, источник ADO и источник ADO NET, не могут получить сведения о параметрах для возвращающей табличное значение функции. Следовательно, в большинстве своем источники не могут вызывать параметризованные функции напрямую.
Существует два конструкторских решения проблемы передачи входных параметров для такой функции.
Сборка параметризованного запроса в виде строки. Чтобы собрать динамическую строку SQL со значениями параметров, жестко запрограммированными в эту строку, можно использовать задачу «Сценарий» или «Выполнение SQL». Затем эту строку можно сохранить в переменной пакета и использовать для задания исходному компоненту свойства SqlCommand. Этот подход приводит к успеху, так как исходный компонент более не требует сведений о параметрах.
Примечание Выполнение предварительно скомпилированных сценариев требует меньше ресурсов, чем использование задачи «Выполнение SQL».
Использование параметризованной оболочки. В качестве альтернативы можно создать параметризованную хранимую процедуру как оболочку, которая вызывает параметризованную возвращающую табличное значение функцию. Этот подход приводит к успеху, так как исходный компонент может успешно получать сведения о параметрах для хранимой процедуры.
В данном разделе используется первое конструкторское решение и создается параметризованный запрос в виде строки.
Подготовка запроса
Чтобы получить возможность объединения входных параметров в единую строку запроса, пользователь должен настроить переменные пакета, необходимые для этого запроса.
Настройка переменных пакета
В окне Переменные среды Business Intelligence Development Studio создайте переменную со строковым типом данных для хранения строки запроса, возвращенной задачей «Выполнение 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')
Добавление задачи потока данных
Последний этап процесса разработки потока управления для пакета — добавление задачи потока данных.
Добавление задачи потока данных и завершение формирования потока управления
- На вкладке Поток управления добавьте задачу потока данных и соедините с задачей, которая объединяла строку запроса.
Следующий шаг
Завершив подготовку строки запроса и настройку задачи потока данных, приступайте к следующему шагу — созданию возвращающей табличное значение функции для получения измененных данных из базы данных.
Следующий раздел:Создание функции для получения измененных данных
|