Транзакционные данные служб SSIS (разные типы записей, один файл) - PullRequest
3 голосов
/ 15 июня 2009

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

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

например. тип записи с «01» в качестве первого поля будет адрес данных. Это будет иметь имя и адрес поля. Тип записи с «02» будет сводными данными с балансами и итогами. Тип записи "03" будет отдельной позицией в выписке.

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

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

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

Ответы [ 4 ]

6 голосов
/ 15 июня 2009

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

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

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

3 голосов
/ 13 мая 2010

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

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

с использованием системы; используя System.Data; using 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.
}

}

0 голосов
/ 15 июня 2009

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

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

0 голосов
/ 15 июня 2009

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

...