SSIS - Как вставить из плоского файла в OLE DB с диапазоном дат? - PullRequest
0 голосов
/ 10 октября 2018

У меня есть источник плоских файлов со столбцами, у которых есть даты начала и окончания в строке, а таблица, в которую я пытаюсь вставить, содержит только один столбец даты, что означает, что мне нужно вставлять 1 строку в неделю от даты начала додата окончания.

Образец FF Источник:Col1, StartDate, EndDate, COL41234,7 / 10 / 2018,28 / 10 / 2018,1.000

Строки для вставки в таблицу:+ ------ + ------------ + ------- +|Col1 |Дата |Col4 |+ ------ + ------------ + ------- +|1234 |7/10/2018 |1.000 ||1234 |14/10/2018 |1.000 ||1234 |21/10/2018 |1.000 ||1234 |28/10/2018 |1.000 |+ ------ + ------------ + ------- +

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вот отдельный ответ о том, как сделать это в SSIS с помощью задачи сценария:

  1. В Поток данных добавьте источник, читающий ваш плоский файл
  2. Добавьте компонент Script ивыбрать преобразование (подключиться к источнику)
  3. Перейти к вводу и выбрать все входы только для чтения
  4. Перейти к вводу / выводу, добавить новый вывод и вызвать его Новый
  5. Добавитьваши новые столбцы Col1, Date, Column (с типами данных)
  6. Перейдите к сценарию и введите его и вставьте следующий код

    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {
        int daysToAdd = 0;
        DateTime SD = Row.StartDate;
    
        while (SD.AddDays(daysToAdd) < Row.EndDate)
        {
            NewBuffer.AddRow();
            NewBuffer.Col1 = Row.Col1;
            NewBuffer.Date = SD.AddDays(daysToAdd);
            NewBuffer.Column = Row.Col4;
    
            daysToAdd = daysToAdd + 7;
        }
    
        //Add the end date
        NewBuffer.AddRow();
        NewBuffer.Col1 = Row.Col1;
        NewBuffer.Date = Row.EndDate;
        NewBuffer.Column = Row.Col4;
    
    }
    

Youтеперь будет иметь новый вывод с именем «New», который преобразовал вашу единственную строку в недельные строки между начальной и конечной датами.

0 голосов
/ 10 октября 2018

Вот как вы могли бы принять предложение Никса и реализовать его:

--This just replicates your load to a staging table
declare @t table (Col1 int,StartDate date,EndDate date,Col4 money)
insert into @t
values
(1234,'10/7/2018','10/28/2018',1.000)

--This will be your insert into final
select Col1,EndDate as [Date],Col4
from @t 

union all

select t.Col1,a.Date,t.col4
from @t t
cross apply (select * 
             from dDate 
             where [Date] >= t.StartDate --This includes start date
                 and [Date] < t.EndDate --This does not include ED, I did this to avoid result not ending on same day of the week
                 and [WeekDay] = datepart(dw,t.StartDate) --Weekly records starting on SD and progressing weekly
            )a
order by 1,2 -- Just for your viewing pleasure

Результаты:

Col1    Date        Col4
1234    2018-10-07  1.00
1234    2018-10-14  1.00
1234    2018-10-21  1.00
1234    2018-10-28  1.00

Предполагается, что у вас есть DateDimension или «Таблица календаря» с полями Date (представляющаякалендарная дата) и день недели (представляет числовое значение дня недели).

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