2

ベンダーから、列ヘッダーのない約10個のタブ区切りのフラットファイルの形式で毎晩データがエクスポートされます。さらに、ベンダーは、ファイルをシステムにインポートできるように、データベーステーブルのSQLスクリプトを提供してくれます。

残念ながら、ベンダーは最近フラットファイルのスキーマを変更しました。各ファイルには150以上の列があり、DBスキーマを調べて、SSISのフラットファイルデータソースの列タイプを調整する必要があることは、非常に時間がかかることは言うまでもありません。

データベーススキーマのファイルデータレイアウトを知っているので、それをフラットファイルソースに動的にプルして列を正しく設定する方法はありますか?それとも、すべてを手動で設定することに固執していますか?

4

2 に答える 2

1

BIDS(いい子)ではこれを行うことはできませんが、オブジェクトモデルでは確かに行うことができます。フォーカスマスターファイルを読み取り(固定幅のフラットテキストレイアウトを記述)、テンプレートパッケージを使用してから、接続マネージャーを更新して列レイアウト(自分のデータ構造に読み込んだ)を反映するプログラムを作成しました。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;
于 2010-05-24T14:29:49.767 に答える
0

http://sqlsrvintegrationsrv.codeplex.com/releases/view/21238も参照してください。

于 2010-05-24T19:09:08.667 に答える