2015-05-08 2 views
0

Что я хочу сделать, это взять данные из файла dbf и вставить его в таблицу. Что я уже сделал. Поскольку существует много файлов, используется контейнер For-Every Container. Однако, прежде чем вставлять его в таблицу, я хочу посмотреть поля даты и сравнить ее с переменной даты. Если даты совпадают с переменной, перейдите к шагу потока. Но если какая-либо из дат не соответствует переменной, то этот файл и его содержимое отбрасываются, и на следующий файл просматривается.Как проверить данные в файле в SSIS перед вставкой в ​​базу данных?

Как это сделать в SSIS?

+0

Is в вашей ситуации есть одно значение для всего файла или определение каждой строки необходимо оценить, чтобы определить, включено ли в загрузку данных? – billinkc

+0

@billinkc Каждая строка имеет поле даты, если я правильно вас понимаю. – dotnetN00b

+0

Вы можете сделать это с помощью задачи сценария. –

ответ

1

Вы ищете компонент условного разделения в рамках задачи потока данных.

Предположим, что ваш исходный столбец является MyDate и у вас есть переменная SSIS называется @[User::ReferenceDate], то вы бы применить такое выражение

[MyDate] == @[User::ReferenceDate] 

Это будет оценивать Истина, когда совпадают даты, ложь в противном случае.

В разделе «Условное разделение» добавьте строку в компонент.

  • OutputName: DatesMatched
  • Состояние: [MyDate] == @[User::ReferenceDate]
  • имя выходного По умолчанию: DatesUnmatched

Теперь, когда вы соедините выход из этого к месту назначения, он спросит, хотите ли вы маршрут данные с использованием пути DatesMatched или DatesUnmatched. Используйте путь DatesMatched.

Как я перечитываю это, if any of the dates don't match the variable, then that file and its contents are discarded, тогда вы смотрите на двойную обработку файла. Первый раз прочитать все это и проверить его. Второй раз, необязательно, будет загружаться в базу данных.

Из условного разделителя добавьте RowCount в путь DatesUnmatched. Используйте переменную типа Integer/Int32 с именем CountDatesUnmatched. В идеальном мире это будет равно нулю, когда проверка файла будет завершена.

В прецедентном ограничении между потоком данных проверки и фактическим потоком данных импорта дважды щелкните по строке соединителя и измените критерии оценки с Constraint на Expression and Constraint. Оставьте значение «Успех» и в выражении используйте @[User::CountDatesUnmatched] == 0 Этот поток данных будет гореть только в том случае, если оба условия верны: синтаксический анализ был успешным, и никакие строки не были отправлены компоненту «Количество строк».

Наконец, вы можете обмануть, и иногда этот подход имеет смысл. Если вы используете назначение OLE DB, вы можете использовать MaximumInsertCommitSize по умолчанию 2B и режим доступа к данным fast load. Это переводится как «Все собирается совершить или ничего не происходит». Это может заблокировать вашу целевую таблицу и заставить журнал транзакций сильно расти в зависимости от того, сколько данных вы загружаете. Используйте условное разделение, как описано выше, но для пути DatesUnmatched, вызывают сбой. Выведенный столбец с делением на ноль или задача сценария с явным событием FireError приведет к тому, что транзакция начнет расти.В обработчике событий OnError вам нужно будет сделать магию, чтобы не прерывать общую обработку файлов, но это ленивый взломать (или тот, который полезен, когда двойное чтение файла является запретительным, но влияние на базу данных меньше)

+0

'С вашего условного разделения, добавьте RowCount в путь DatesUnmatched. Используйте переменную типа Integer/Int32 с именем CountDatesUnmatched. В идеальном мире это будет равно нулю, когда проверка файла будет завершена. «... Как мне добавить RowCount в DatesUnmatched path»? Я немного застрял в этой точке. – dotnetN00b

+0

Поцарапать это. Я не понимал, что RowCount - это компонент, например Conditional Split. – dotnetN00b