Подтвердить что ты не робот

Как управлять потоком пакетов SSIS на основе количества записей, возвращаемых запросом?

Я пытаюсь сначала проверить, есть ли какие-либо новые записи для обработки, прежде чем я выполню свой пакет. У меня есть бит поля, называемого "обработанным" в таблице SQL Server 2008 R2, которая имеет значение 1, если обрабатывается, и 0, если нет.

Я хочу запросить его таким образом:

select count(processed) from dbo.AR_Sale where processed = 0

Если результат равен 0, я хочу отправить сообщение по электронной почте о том, что записей там нет. Если больше нуля, я хочу продолжить выполнение пакета. Я новичок в SSIS и не могу понять, какой инструмент использовать для этого.

В моем пакете есть элемент потока данных с подключением OLE DB внутри него к базе данных. Соединение использует запрос для возврата записей. К сожалению, запрос завершается успешно (как и должно быть), даже если нет записей для обработки. Вот запрос:

Select * from dbo.AR_Sale where processed = 0

Я копирую эти записи в хранилище данных, а затем запускаю другой запрос, чтобы обновить исходную таблицу, изменив обработанное поле с 0 на 1.
Любая помощь будет принята с благодарностью.

4b9b3361

Ответ 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

Variables

В проекте 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 страницу в левой части

Execute SQL Task - General

Настройте страницу "Результат набора" для выполнения задачи SQL Execute, как показано ниже:

  • Нажмите кнопку "Добавить", чтобы добавить новую переменную, которая сохранит значение счетчика, возвращаемое запросом
  • Измените имя результата на 0, чтобы указать первое значение столбца, возвращаемое запросом
  • Задайте имя переменной User::Processed
  • Нажмите OK

Execute SQL Task - Result Set

На вкладке Control Flow пакета перетащите и отпустите задачу отправки почты и поток данных из панели инструментов. Вкладка "Flow Flow" должна выглядеть примерно так:

Control Flow tab

Щелкните правой кнопкой мыши зеленую стрелку, соединяющую задачу Execute SQL и Send Mail Task. Нажмите "Изменить"... Зеленая стрелка называется прецедентом.

Right-click constraint 1

В редакторе ограничений приоритета выполните следующие шаги:

  • Задайте операцию оценки Expression
  • Установите выражение в @[User::Processed] == 0. Это означает, что этот путь следует использовать только тогда, когда переменная Processed установлена ​​на ноль.
  • Нажмите "ОК"

Equal to zero

Щелкните правой кнопкой мыши зеленую стрелку, соединяющую задачу Execute SQL и задачу потока данных. Нажмите "Изменить"... В редакторе ограничений приоритета выполните следующие шаги:

  • Задайте операцию оценки Expression
  • Установите выражение в @[User::Processed] != 0. Это означает, что этот путь следует использовать только тогда, когда переменная Processed не установлена ​​в ноль.
  • Нажмите "ОК"

Not equal to zero

Вкладка "Управление потоком" будет выглядеть следующим образом. Вы можете настроить задачу "Отправить почту" для отправки электронной почты и задачи потока данных для обновления данных в соответствии с вашими требованиями.

Control Flow final

Когда я выполняю пакет с набором данных на основе таблицы заполнения script, пакет будет выполнять задачу потока данных, потому что есть одна строка, которая не обрабатывается.

Data Flow Task logic

Когда я выполняю пакет после установки параметра "Обработанный флаг" в 1 во всех строках таблицы с помощью script UPDATE dbo.AR_Sale SET Processed = 1, пакет выполнит задачу "Отправить почту".

Send Mail Task logic

Надеюсь, что это поможет.

Ответ 2

Ваш дизайн SSIS должен быть

Src:

Select count(processed) Cnt from dbo.AR_Sale where processed = 0

Условный этап разделения [при преобразовании потока данных]:

output1: Order 1, Name - EmailCnt, Condition - Cnt = 0
output2: Order 2, Name - ProcessRows, Condition - Cnt > 0

Выходные ссылки:

EmailCnt Link: Send email

ProcessRowsLink: DataFlowTask