SSIS - Могу ли я получить схему столбцов для источника плоских файлов из базы данных? - PullRequest
2 голосов
/ 24 мая 2010

Мы получаем ночной экспорт данных от поставщика в виде около 10 плоских файлов с разделителями табуляции без заголовков столбцов. Кроме того, поставщик предоставляет нам сценарии SQL для таблиц базы данных, чтобы мы могли импортировать файлы в нашу систему.

К сожалению, поставщик недавно изменил схему для плоских файлов. Каждый файл имеет более 150 столбцов, и необходимость проходить через схему БД и настраивать типы столбцов в источнике данных «Плоский файл» в SSIS требует очень много времени, не говоря уже о королевской боли.

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

Ответы [ 2 ]

1 голос
/ 24 мая 2010

Вы не можете сделать это через BIDS (парень, это было бы неплохо), но вы, безусловно, можете сделать это через объектную модель.Я построил программу, которая считывала мастер-файлы Focus (описывала разметку текста с фиксированной шириной) и использовала пакет шаблонов, а затем обновляю менеджер соединений, чтобы отразить разметку столбцов (которую я прочитал в своей собственной структуре данных).Синтаксический анализ SQL может быть немного сложнее, но он, безусловно, полуавтоматизирован.

Обратите внимание, что если у SQL есть собственные типы, такие как int, кто-то должен будет сказать вам, или вам придется выяснить, насколько широкоint находится в текстовом файле, если вы используете столбцы фиксированной ширины.В этом случае ваша жизнь может быть намного проще в CSV.

Моя полная программа также выполняет преобразование производного столбца в области обрезки и выполняет некоторые другие действия - сгенерированный пакет затем очищается и тестируется вручную.

Вот пример кода (mf - моя объектная модель для мастер-файла, этот код загружает пакет шаблонов, добавляет диспетчер соединений, помещает все поля):

        Application App = new Microsoft.SqlServer.Dts.Runtime.Application();
        p = App.LoadPackage(TemplatePackage, null);

        ConnectionManager cm = p.Connections.Add("FLATFILE");
        cm.Properties["Name"].SetValue(cm, mf.SSISConnectionManagerName);
        cm.Properties["ConnectionString"].SetValue(cm, FlatFilePath);
        cm.Properties["Format"].SetValue(cm, "FixedWidth");
        cm.Properties["RowDelimiter"].SetValue(cm, "\r\n");
        cm.Properties["HeaderRowDelimiter"].SetValue(cm, "\r\n");
        cm.Properties["CodePage"].SetValue(cm, 1252);
        cm.Properties["ConnectionString"].SetExpression(cm, "@[User::FilePath] + \"\\\\\" + @[User::FileName]");

        RWrap.IDTSConnectionManagerFlatFile90 con = cm.InnerObject as RWrap.IDTSConnectionManagerFlatFile90;

        List<FocusField> flds = mf.Fields();
        foreach (FocusField fld in flds)
        {
            RWrap.IDTSConnectionManagerFlatFileColumn90 Col = con.Columns.Add();
            (Col as RWrap.IDTSName90).Name = fld.FieldName;
            Col.ColumnType = "FixedWidth";
            Col.ColumnDelimiter = "";

            Col.DataType = RWrap.DataType.DT_STR;
            Col.ColumnWidth = fld.SSISColumnWidth;
            Col.MaximumWidth = fld.SSISColumnWidth;
        }

        RWrap.IDTSConnectionManagerFlatFileColumn90 EolCol = con.Columns.Add();
        (EolCol as RWrap.IDTSName90).Name = "CRLF";
        EolCol.ColumnType = "FixedWidth";
        EolCol.ColumnDelimiter = "";
        EolCol.DataType = RWrap.DataType.DT_STR;
        EolCol.ColumnWidth = 2;
        EolCol.MaximumWidth = 2;
0 голосов
/ 24 мая 2010
...