Транзакционные данные SSIS (разные типы записей, один файл)

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

Некоторые данные поступают в один плоский файл с разными типами записей.

например тип записи с «01» в качестве первого поля будет адресными данными. В нем будут поля имени и адреса. Тип записи с «02» будет сводными данными, с балансами и итогами. Запись типа «03» будет отдельной строкой в ​​выписке.

Каждый оператор будет иметь одну запись 01 и 02 и несколько записей 03. Я мог бы предварительно проанализировать файл и разделить его на 3 файла для загрузки в таблицу, но это далеко не идеально.

Мы берем файл и выполняем с ним несколько манипуляций (например, добавляем еще пару полей в адресную запись и, возможно, делаем некоторое суммирование / проверку), а затем отправляем файл почти в том же формате (но с дополнительными полями добавлено) в нашу программу компоновки для печати.

Как бы вы это сделали в SSIS?


person Dane    schedule 15.06.2009    source источник


Ответы (4)


Большая проблема с вариантными записями в SSIS заключается в том, что вы не получаете никаких преимуществ диспетчера соединений, помогающих с макетом, поскольку диспетчер соединений может обрабатывать только один макет.

Как правило, вы получаете плоский файл с завершением CRLF с двумя столбцами: тип записи и данные записи. Затем вы вводите условное разбиение и анализируете каждый тип строки по разным путям. При синтаксическом анализе необходимо будет разделить оставшиеся данные записи и поместить их в столбцы и преобразовать как обычно, либо с помощью преобразования производного столбца, либо преобразования сценария и, возможно, преобразований преобразования.

Если бы у вас было много пакетов, я бы серьезно подумал о написании настраиваемого компонента, который производил бы 3 вывода, уже преобразованных в ваши целевые типы.

person Cade Roux    schedule 15.06.2009
comment
Не думаете, что есть какие-то общие пользовательские компоненты, которые могут справиться с такими вещами? т.е. указать поле типа записи и поля вывода без необходимости его кодирования? В противном случае, возможно, пришло время написать собственный код! - person Dane; 15.06.2009
comment
Не то, чтобы я в курсе. Если вы его найдете, найдите мой лучший вопрос о компонентах SSIS и добавьте его туда. - person Cade Roux; 15.06.2009

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

/ * Компонент сценария служб интеграции Microsoft SQL Server * Написание сценариев с использованием Microsoft Visual C # 2008. * ScriptMain - это класс точки входа сценария. * /

используя Систему; using System.Data; используя Microsoft.SqlServer.Dts.Pipeline.Wrapper; используя Microsoft.SqlServer.Dts.Runtime.Wrapper;

[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute] открытый класс ScriptMain: UserComponent {статическая строка AccountNumber = null;

public override void PreExecute()
{
    base.PreExecute();
    /*
      Add your code here for preprocessing or remove if not needed
    */
}

public override void PostExecute()
{
    base.PostExecute();
    /*
      Add your code here for postprocessing or remove if not needed
      You can set read/write variables here, for example:
      Variables.MyIntVar = 100
    */
}

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    if (Row.RecordType == "02")
        AccountNumber = Row.AcctNum; // Store incomming Account Number into local script variable
    else if (Row.RecordType == "06" || Row.RecordType == "07" || Row.RecordType == "08" ||
             Row.RecordType == "09" || Row.RecordType == "10")
        Row.AcctNum = AccountNumber; // Put Stored Account Number on this row.
}

}

person David    schedule 13.05.2010

Это возможно, но вам придется написать собственную логику. Я однажды проделал это с DTS. Если файл разделен разделителями, SSIS будет правильно импортировать поля. Вы можете написать сценарий, который проверяет поле типа записи, а затем выполняет переходы на разные вставки в зависимости от типа записи. Если в файле есть записи, которые не разграничены, но каждый тип имеет свою фиксированную ширину, это становится намного сложнее, поскольку вам придется анализировать и разбивать каждую импортированную строку с типами записей и их шириной, жестко закодированными в скрипте. .

person cdonner    schedule 15.06.2009
comment
Нет необходимости писать собственные скрипты в SSIS. Условное разделение - это простой процесс «если-то», для которого требуется только логика, а не сценарии. - person Eric; 15.06.2009
comment
Как насчет файлов фиксированной ширины? Можете ли вы исключить определенную позицию в данных, а не имя столбца? - person cdonner; 15.06.2009

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

Убедитесь, что ваш источник настроен с правильными типами данных, чтобы ничего не пропадало (например, все строки). Затем просто проверьте поле «Тип записи» в этом условном разбиении, чтобы отправить его в правую ветвь.

person Eric    schedule 15.06.2009
comment
Обычный способ работы с исходными данными не сработает, поскольку источник может обрабатывать только один макет. См. Ответ Кейда. - person Sam; 02.02.2010