Как пропустить последнюю строку в потоке данных служб SSIS
Я использую FlatFile Source Manager
-> Script COmponent as Trans
-> OLEDB destination
в моем потоке данных.
Источник читает все строки из плоского файла, и я хочу пропустить последнюю строку (запись трейлера), обновляя базу данных.
Поскольку он содержит NULL
значения, база данных выдает ошибку.
Пожалуйста, помогите мне, как решить эту проблему.
С уважением, VHK
2 ответа
Если ваше требование состоит в том, чтобы избежать строк, имеющих нулевые значения в плоском файле, то вы можете следовать нижеприведенному подходу,
- Чтение данных из плоского файла с использованием исходного компонента.
- использование
Conditional Split
компонент, а вcase expression
предоставить как!ISNULL(Column1) && !ISNULL(Column2)
(Column1 и Column2 могут быть по вашему желанию. Если ваш плоский файл имеет столбец с именем, скажем,ID
и он не имеет нулевого значения, кроме последней строки, то вы можете использовать как!ISNULL(ID)
). - Сопоставьте выходные данные случая с пунктом назначения OLEDB.
Надеюсь, это вам очень поможет.
Чтобы проигнорировать последнюю строку, вы должны сделать следующие шаги:
- Добавить
DataFlow Task
(давайте назовем этоDFT RowCount
) - Добавить глобальную переменную типа
System.Int32
(Имя: Пользователь::RowCount) - В этой задаче DataFlow добавить
Flat File Source
(Файл, который вы хотите импортировать) - Добавить
RowCount
компонент рядом сFlat File Source
- Карта
RowCount
результат переменнойUser::RowCount
- Добавить еще
DataFlow Task
(давайте назовем этоDFT Import
)
- В
DFT Import
добавитьFlat File Source
(Файл, который нужно импортировать) - Добавить
Script Component
сразу послеFlat File Source
- добавлять
User::RowCount
Переменная для сценария ReadOnly Переменные
- Добавить столбец вывода типа
DT_BOOL
(Название:IsLastRow
)
В окне скриптов напишите следующий скрипт
Dim intRowCount As Integer = 0 Dim intCurrentRow As Integer = 0 Public Overrides Sub PreExecute() MyBase.PreExecute() intRowCount = Variables.RowCount End Sub Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer) intCurrentRow += 1 If intCurrentRow = intRowCount Then Row.IsLastRow = True Else Row.IsLastRow = False End If End Sub
Добавить
Conditional Split
Рядом с компонентом сценарияРазделить строки, используя следующее выражение
[IsLastRow] == False
- Добавить
OLEDB Destination
рядом с условным разделением
Примечание: если вы хотите игнорировать строки для другого случая (не для последней строки), просто измените сценарий, написанный в компоненте сценария, в соответствии с вашими требованиями