sql >> データベース >  >> RDS >> Sqlserver

SSISで入力列と出力列を動的にマップする方法は?

    同様のテーブルを作成する場合は、2つのアプローチで使用して、SSISパッケージ内で列を動的にマップするか、パッケージ全体をプログラムでビルドする必要があります。この回答では、その方法についていくつかの洞察を提供しようと思います。

    (1)エイリアスを使用したソースSQLコマンドの構築

    注:このアプローチは、すべての.dbfファイルの列数が同じで、名前が異なる場合にのみ機能します

    このアプローチでは、作成したFileIDとマッピングテーブルに基づいてソースとして使用されるSQLコマンドを生成します。変数内に格納されているFileIDと.dbfファイルパスを知っておく必要があります。例として:

    テーブル名がinputoutputMappingであると仮定します

    次のコマンドを使用してSQL実行タスクを追加します。

    DECLARE @strQuery as VARCHAR(4000)
    
    SET @strQuery = 'SELECT '
    
    SELECT @strQuery = @strQuery + '[' + InputColumn + '] as [' + OutputColumn + '],'
    FROM inputoutputMapping
    WHERE FileID = ?
    
    SET @strQuery = SUBSTRING(@strQuery,1,LEN(@strQuery) - 1) + ' FROM ' + CAST(? as Varchar(500))
    
    SELECT @strQuery
    

    また、[パラメータマッピング]タブで、パラメータ0にマッピングするFileIDを含む変数を選択します。 パラメータ1の.dbfファイル名(テーブル名の代わり)を含む変数

    ResultSetタイプをSingle Rowに設定します ResultSet 0を保存します 例として文字列型の変数内@[User::SourceQuery]

    ResultSetの値は次のようになります:

    SELECT [CustCd] as [CustCode],[CNAME] as [CustName],[Address] as [CustAdd] FROM database1
    

    OLEDB Source内 変数からSQLコマンドへのテーブルアクセスモードを選択し、@[User::SourceQuery]を使用します ソースとしての変数。

    (2)ソースとしてのスクリプトコンポーネントの使用

    このアプローチでは、データフロータスク内のソースとしてスクリプトコンポーネントを使用する必要があります:

    まず、ハードコーディングしたくない場合は、変数を介して.dbfファイルパスとSQLServer接続をスクリプトコンポーネントに渡す必要があります。

    スクリプトエディタ内で、宛先テーブルで見つかった各列の出力列を追加し、それらを宛先にマップする必要があります。 。

    スクリプト内で、.dbfファイルをデータテーブルに読み込む必要があります:

    • C#.DBFファイルからデータテーブルに読み込む
    • DBFをDataTableにロードする

    データをデータテーブルに読み込んだ後、SQLServerで作成したMappingTableにあるデータを別のデータテーブルに入力します。

    その後、データテーブルの列をループし、.ColumnNameを変更します 例として、関連する出力列に移動します:

    foreach (DataColumn col in myTable.Columns)
        {
    
        col.ColumnName = MappingTable.AsEnumerable().Where(x => x.FileID = 1 && x.InputColumn = col.ColumnName).Select(y => y.OutputColumn).First(); 
    
        }
    

    データテーブルの各行をループした後、スクリプト出力行を作成します。

    さらに、出力行を割り当てるときに、列が存在するかどうかを確認する必要があることに注意してください。最初にすべての列名を文字列のリストに追加してから、例として確認するために使用できます。

    var columnNames = myTable.Columns.Cast<DataColumn>()
                                 .Select(x => x.ColumnName)
                                 .ToList();  
    
    
    foreach (DataColumn row in myTable.Rows){
    
    if(columnNames.contains("CustCode"){
    
        OutputBuffer0.CustCode = row("CustCode");
    
    }else{
    
        OutputBuffer0.CustCode_IsNull = True
    
    }
    
    //continue checking all other columns
    
    }
    

    スクリプトコンポーネントをソースとして使用する方法の詳細が必要な場合は、次のリンクのいずれかを確認してください。

    • ソースとしてのSSISスクリプトコンポーネント
    • スクリプトコンポーネントを使用したソースの作成
    • ソースとしてのスクリプトコンポーネント– SSIS
    • SSIS –ソースとしてスクリプトコンポーネントを使用する

    (3)パッケージを動的に構築する

    パッケージを動的にビルドする選択肢がある場合を除いて、この目標を達成するために使用できる方法は他にないと思います。その場合は、次の方法を使用する必要があります。

    • BIML
    • 統合サービスの管理対象オブジェクトモデル
    • EzApiライブラリ

    (4)SchemaMapper:C#スキーママッピングクラスライブラリ

    最近、C#を使用して開発されたクラスライブラリであるGit-Hubで新しいプロジェクトを開始しました。これを使用して、Excel、Word、Powerpoint、Text、csv、html、json、およびxmlから、スキーママッピングアプローチを使用して異なるスキーマ定義を持つSQLサーバーテーブルに表形式のデータをインポートできます。でチェックしてください:

    • SchemaMapper:C#スキーママッピングクラスライブラリ

    ステップバイステップガイドについては、このWikiページをたどることができます:

    • 複数のファイルから1つのSQLテーブルにステップバイステップガイドでデータをインポートする



    1. PostgreSQLは世界最高のデータベースです

    2. SQLServerの既存の列にIDプロパティを追加するにはどうすればよいですか

    3. SOUNDSLIKE演算子がMySQLでどのように機能するか

    4. PostgreSQLの命名規則