Ответ 1
Одним из вариантов было бы использовать ограничение приоритета в сочетании с задачей Execute SQL для достижения этой функциональности. Вот пример того, как достичь этого в SSIS 2008 R2
.
Я создал простую таблицу на основе информации, предоставленной в вопросе.
Создать таблицу script:
CREATE TABLE dbo.AR_Sale(
Id int NOT NULL IDENTITY PRIMARY KEY,
Item varchar(30) NOT NULL,
Price numeric(10, 2) NOT NULL,
Processed bit NOT NULL
)
GO
Затем занесена новая таблица с некоторыми образцами данных. Вы можете видеть, что одна из строк имеет флаг Обработанный, установленный в ноль.
Таблица заполнения script:
INSERT INTO dbo.AR_Sale (Item, Price, Processed) VALUES
('Item 1', 23.84, 1),
('Item 2', 72.19, 0),
('Item 3', 45.73, 1);
В пакете SSIS создайте следующие две переменные.
-
Processed
типа данныхInt32
-
SQLFetchCount
типа данныхString
со значением, установленным наSELECT COUNT(Id) ProcessedCount FROM dbo.AR_Sale WHERE Processed = 0
В проекте SSIS создайте источник данных OLE DB, который указывает на базу данных по вашему выбору. Добавьте источник данных в диспетчер соединений пакетов. В этом примере я использовал источник данных как Practice
.
На вкладке Control Flow
пакета перетащите и перетащите Запуск задачи SQL из панели инструментов.
Настройте общую страницу SQL-задачи Execute, как показано ниже:
- Дайте правильное имя, скажем
Check pre-execution
- Измените ResultSet на
Single row
, потому что запрос возвращает скалярное значение - Задайте подключение к источнику данных OLE DB, в этом примере
Practice
- Установите SQLSourceType в
Variable
, потому что мы будем использовать запрос, хранящийся в переменной - Установите для параметра SourceVariable значение
User::SQLFetchCount
- Нажмите
Result Set
страницу в левой части
Настройте страницу "Результат набора" для выполнения задачи SQL Execute, как показано ниже:
- Нажмите кнопку "Добавить", чтобы добавить новую переменную, которая сохранит значение счетчика, возвращаемое запросом
- Измените имя результата на
0
, чтобы указать первое значение столбца, возвращаемое запросом - Задайте имя переменной
User::Processed
- Нажмите
OK
На вкладке Control Flow
пакета перетащите и отпустите задачу отправки почты и поток данных из панели инструментов. Вкладка "Flow Flow" должна выглядеть примерно так:
Щелкните правой кнопкой мыши зеленую стрелку, соединяющую задачу Execute SQL и Send Mail Task. Нажмите "Изменить"... Зеленая стрелка называется прецедентом.
В редакторе ограничений приоритета выполните следующие шаги:
- Задайте операцию оценки
Expression
- Установите выражение в
@[User::Processed] == 0
. Это означает, что этот путь следует использовать только тогда, когда переменная Processed установлена на ноль. - Нажмите "ОК"
Щелкните правой кнопкой мыши зеленую стрелку, соединяющую задачу Execute SQL и задачу потока данных. Нажмите "Изменить"... В редакторе ограничений приоритета выполните следующие шаги:
- Задайте операцию оценки
Expression
- Установите выражение в
@[User::Processed] != 0
. Это означает, что этот путь следует использовать только тогда, когда переменная Processed не установлена в ноль. - Нажмите "ОК"
Вкладка "Управление потоком" будет выглядеть следующим образом. Вы можете настроить задачу "Отправить почту" для отправки электронной почты и задачи потока данных для обновления данных в соответствии с вашими требованиями.
Когда я выполняю пакет с набором данных на основе таблицы заполнения script, пакет будет выполнять задачу потока данных, потому что есть одна строка, которая не обрабатывается.
Когда я выполняю пакет после установки параметра "Обработанный флаг" в 1 во всех строках таблицы с помощью script UPDATE dbo.AR_Sale SET Processed = 1
, пакет выполнит задачу "Отправить почту".
Надеюсь, что это поможет.