Решение (1): использование SQL (DENSE_RANK (), MODULO) + условное разбиение
Вы можете использовать команду SQL, аналогичную источнику OLEDB, она сгенерирует столбец, который разделит данные на основе номера строки.
SELECT ID, DENSE_RANK() OVER(PARTITION BY ID % 3 ORDER BY ID) % 2 as DestinationTable
FROM Table1 ORDER BY ID
После этого вы можете использовать компонент условного разделения, чтобы разделить поток на пункт назначения rwo.
Примечание. При обработке большого количества данных необходимо убедиться, что вы создали соответствующие индексы)
Решение (2): Использование компонента сценария + условное разбиение
- Сначала у вас есть нужный менеджер соединений OLEDB (Соединения источника и назначения)
- Добавление задачи потока данных
- В задаче потока данных добавьте
OLEDB Source
, который читает из исходной таблицы
- Добавьте компонент сценария, в котором вам нужно реализовать описанную логику, и вы должны добавить выходной столбец, содержащий идентификатор таблицы назначения.
Код сценария (VB.NET)
Public Class ScriptMain
Inherits UserComponent
Private RowCounter As Integer = 0
Private DestinationTableID As Integer = 1
Public Overrides Sub Input0_ProcessInputRow(ByVal Row As Input0Buffer)
RowCounter += 1
Row.DestinationTable = DestinationTableID
If RowCounter = 3 Then
RowCounter = 0
If DestinationTableID = 1 Then
DestinationTableID = 2
Else
DestinationTableID = 1
End If
End If
End Sub
End Class
- Добавить условное разделение, которое разделяет поток на основе идентификатора таблицы (если идентификатор таблицы == 1, чем вставить данные в пункт назначения 1 или пункт назначения 2)
- Подключите каждый поток к соответствующему назначению
Примечание
Если ваша цель состоит в том, чтобы распределить данные по двум пунктам назначения без каких-либо условий, вы можете использовать только условное преобразование разделения для разделения данных, используя (по модулю) следующее выражение (где 2 - номер пункта назначения вам нужно)
Row.ID % 2 == 0
Или вы можете использовать Сбалансированный распределитель данных , чтобы добиться этого без какой-либо ручной реализации.