как загрузить множество записей в одной таблице и другие набор записей в другую таблицу в ssis - PullRequest
0 голосов
/ 07 января 2019

У меня есть вопрос, основанный на сценарии. Скажем, у меня есть таблица с миллионами записей с несколькими столбцами. Я хочу загрузить данные в два разных места назначения в ssis, основываясь на количестве строк, первые 3 строки должны перейти в одну таблицу, а второй набор из трех строк - в другую таблицу. и это должно повторяться до тех пор, пока все записи не будут загружены в два места назначения.

Table1:

ID
1
2
3
4
5
6
7
8
9
10
11
12

Итак, в первой целевой таблице должны быть записи

1
2
3
7
8
9

и Второй стол должен иметь

4
5
6
10
11
12

Пожалуйста, дайте мне сейчас подход

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Решение (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): Использование компонента сценария + условное разбиение

  1. Сначала у вас есть нужный менеджер соединений OLEDB (Соединения источника и назначения)
  2. Добавление задачи потока данных
  3. В задаче потока данных добавьте OLEDB Source, который читает из исходной таблицы
  4. Добавьте компонент сценария, в котором вам нужно реализовать описанную логику, и вы должны добавить выходной столбец, содержащий идентификатор таблицы назначения.

Код сценария (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, чем вставить данные в пункт назначения 1 или пункт назначения 2)
  2. Подключите каждый поток к соответствующему назначению

Примечание

Если ваша цель состоит в том, чтобы распределить данные по двум пунктам назначения без каких-либо условий, вы можете использовать только условное преобразование разделения для разделения данных, используя (по модулю) следующее выражение (где 2 - номер пункта назначения вам нужно)

Row.ID % 2 == 0

Или вы можете использовать Сбалансированный распределитель данных , чтобы добиться этого без какой-либо ручной реализации.

0 голосов
/ 07 января 2019

вы можете использовать Conditional Split Transformation. Для этого

  • Перейдите на вкладку «Поток данных» и перетащите из панели инструментов преобразование «Условное разбиение» в область конструктора.
  • Соедините преобразование «Условное разбиение» с потоком данных, перетащив соединитель из источника данных
  • Дважды щелкните преобразование «Условное разбиение».
  • В Редакторе преобразования с условным разбиением создайте выражения для использования в качестве условий, перетаскивая переменные, столбцы, функции и операторы в столбец Условие в сетке. Или вы можете ввести выражение в столбце Условие.
  • The Click Ok.

В вашем случае условия потока могут быть ID % != 0 и ID % 3 == 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...