Ничто из коробки напрямую не поддерживает этот сценарий, но я могу придумать несколько подходов, которые вы можете совместить, чтобы выполнить свой запрос.
Самый чистый / простой в реализации - это просто поместить все ваши данные в промежуточную таблицу, и, поскольку я ленив, я бы добавил вычисляемый столбец в определение таблицы, который помечает строку как имеющую где-то значение NULL.
ALTER TABLE dbo.stageData
ADD HasNull AS (CASE WHEN Col1 IS NULL OR Col2 IS NULL THEN 'Y' ELSE 'N');
Затем вы должны добавить две задачи «Выполнить SQL» после потока данных. Первый отправляет электронное письмо (при условии, что у вас настроен msdb.dbo.sp_send_dbmail) Я бы сделал что-нибудь
IF EXISTS (SELECT * FROM dbo.StageData AS SD WHERE SD.HasNull = 'Y')
BEGIN
EXECUTE msdb.dbo.sp_send_db_mail @recipient = 'ocean800', @subject = 'Null detected';
END
Я бы тогда получил задачу Execute SQL, которая привязывает данные со сцены к финальной стол. Дважды проверьте мой лог c здесь, так как я его не закодировал. Может потребоваться ЛЮБОЙ или просто повторить logi отправки почты c и добавить вставку в качестве предложения ELSE. Черт, это могло бы быть проще ...
INSERT INTO dbo.Final SELECT * FROM dbo.StageData AS SD WHERE NOT EXISTS (SELECT * FROM dbo.StageData AS SDI SDI.HasNull ='Y');
Подход без таблицы этапов заключался бы в двойной обработке вашего файла. Первым потоком данных будет источник плоского файла для условного разделения, а затем ... что угодно на самом деле. Я бы go просто использовал преобразование Row Count, которое заполнит созданную вами переменную SSIS с именем RowsNull. После запуска потока данных у вас будет значение ноль (готово к загрузке) или больше нуля - отправьте электронное письмо.
Раздвоение задачи потока данных в задачу потока данных, которая фактически сохраняется в нашей таблице и уведомлении (Отправить задачу по электронной почте, выполнить SQL задачу по отправке электронной почты, что угодно). Хитрость здесь заключается в том, чтобы изменить прецедентное ограничение между родительской задачей (поток данных) и дочерними путями. Вы установите для него Expression and Constraint. Ограничение остается успешным, а ограничения следующие: @ [User :: RowsNull] == 0 и @ [User :: RowsNull]> 0
Другими менее удачными методами может быть указание того, что назначение OLE DB сохраняет настройки по умолчанию ( Строки в пакете пустые, а максимальный размер фиксации вставки равен max int). Этот параметр представляет собой фиксацию всего или ничего - вам просто нужно что-то, чтобы взорвать неявную транзакцию, поэтому в вашем условном разделении для пути HasNull перенаправьте строки в задачу сценария, которая вызвать событие ошибки. Это убьет груз. Или определите свою целевую таблицу со спецификатором NOT NULL для этих столбцов, и тогда данные будут загружаться или нет, и вам просто нужно добавить задачу электронной почты по вашему выбору в ограничение прецедента Failure потока данных, чтобы уведомить, когда загрузка не удалась.