Вот пример, который может дать вам представление о том, что вы можете сделать.В идеале, в пакете служб SSIS или в любом задании ETL следует учитывать, что данные могут быть не совсем такими, какими вы хотели бы их видеть.Вы должны предпринять соответствующие шаги для обработки неверных или недействительных данных, которые могут появляться время от времени.Вот почему SSIS предлагает множество задач Transformation в Data Flow Task, которые вы можете использовать для очистки данных.
В вашем случае вы можете использовать преобразование Derived Column
или преобразование Data conversion
чтобы удовлетворить ваши требования.
Пример был создан в SSIS 2008 R2
.В нем показано, как читать плоский файл, содержащий даты, и загружать его в таблицу SQL.
![file](https://i.stack.imgur.com/iMPG7.png)
Я создал простую таблицу SQL для импорта данных плоского файла.
![Table](https://i.stack.imgur.com/AMYy3.png)
В пакете служб SSIS у меня есть диспетчер соединений с SQL и один для плоского файла.Подключение плоского файла настроено, как показано ниже.
![Connection](https://i.stack.imgur.com/wHYja.png)
![Flat file 1](https://i.stack.imgur.com/4gY8N.png)
![Flat file 2](https://i.stack.imgur.com/rLQX5.png)
![Flat file 3](https://i.stack.imgur.com/m78d2.png)
В пакете служб SSIS я поместил задачу потока данных на вкладку «Поток управления».Внутри задачи «Поток данных» у меня есть источник плоских файлов, преобразование производного столбца и назначение OLE DB.Поскольку источник плоских файлов и назначение OLE DB просты, я оставлю их здесь.Производное преобразование создает новый столбец с выражением (DT_DBDATE)SmallDate
.Обратите внимание, что вы можете также использовать преобразование преобразования данных, чтобы сделать то же самое.Этот новый столбец SmallDateTimeValue должен быть сопоставлен со столбцом базы данных в месте назначения OLE DB.
![Derived column](https://i.stack.imgur.com/Tnr8M.png)
Если выполнить этот пакет, произойдет сбой, поскольку не все значения в файле являются действительными,
![Failed](https://i.stack.imgur.com/902ep.png)
Причина сбоя в вашем случае в том, что недопустимые данные вставляются непосредственно в таблицу.В вашем случае таблица выдаст исключение, что приведет к сбою пакета.В этом примере происходит сбой пакета, поскольку по умолчанию при преобразовании производного столбца происходит сбой компонента в случае возникновения ошибки.Итак, давайте разместим фиктивное преобразование для перенаправления строк ошибок.Мы сделаем многоадресное преобразование для этой цели.Это на самом деле ничего не сделает.В идеале следует перенаправить строки ошибок в другую таблицу, используя пункт назначения OLE DB или другой компонент назначения по вашему выбору, чтобы можно было проанализировать данные, которые вызывают ошибки.
Перетащите красную стрелку из преобразования «Производное» и подключите его кМногоадресное преобразование.Откроется диалоговое окно «Настройка вывода ошибок».Измените значения в столбце Ошибка и усечение с Компонент сбоя на Redirect row
.Это перенаправит все строки ошибок в преобразование Multicast и не попадет в таблицы.
![Configure Error output](https://i.stack.imgur.com/SOaLm.png)
Теперь, если мы выполним пакет, он будет успешно выполнен.Обратите внимание на количество строк, отображаемых в каждом направлении.
![Success](https://i.stack.imgur.com/ysZwu.png)
Вот данные, которые попали в таблицу.Только 2 строки были действительны.Вы можете посмотреть на первый снимок экрана, на котором показаны данные в файле, и вы видите, что действительными были только 2 строки.
Надеюсь, что это даст вам идею реализовать ваше требование в пакете служб SSIS.
![Table data](https://i.stack.imgur.com/5P9mp.png)