3

わかりました、私はSSISにかなり慣れていないので、あるシステムのフラットファイルを別のシステムにインポート可能なファイルに変換しようとしています。

このファイル変換の一部は、ヘッダー レコードの利用です。ヘッダー レコードは、いくつかの固定コンポーネントといくつかの動的コンポーネントで構成されます。動的コンポーネントは、レコード数と支払い金額 (以下の式の「PAYAMT」) です。ヘッダー プロパティ式を使用してヘッダーを詳細レコードに追加しようとしています。

"00" + REPLICATE("0",6-LEN((DT_STR,6,1252) @[User::RecordCountA1200])) + (DT_STR,6,1252) @[User::RecordCountA1200] + "PAYAMT" + "P1200000000000000000000"

支払額フィールドは通貨のデータ型です。私が最初に考えたのは、集計変換を使用して、レコードセットの変換先に保存することでした。集計によって正しい合計が得られましたが、変数はオブジェクトとしてのみ格納でき、最初に期待していた数値データ型としては格納できません。すべてのレコードの PayAmount の合計を取り、それを SumAmountA1200 というユーザー定義変数に入れたいと思います。

集約変換からの値を他のタイプの変換に格納し、それをパッケージ レベルの変数に変換することは可能ですか? これを別の方法で行う必要がありますか?どんなフィードバックでも大歓迎です

4

1 に答える 1

2

このための最初のオプションは、集計変換に接続されたスクリプト変換を使用することです。

SSIS 変数にアクセスできるのは、データ フローの実行前/実行後フェーズのみです。この制限により、スクリプトが実行しようとしているのは、Input0_ProcessInputRowイベント内の任意のロジックを実行することです。非常に具体的なケースでは、送信される行は 1 つだけであり、Row の値をクラス スコープのメンバー変数に割り当てる必要があります。

PostExecute メソッドで、変数の値をメンバー変数の値に割り当てます。

サンプルコード

このスクリプトは、宛先として機能するスクリプト変換です。変数を読み取り/書き込み (User::ExternalVariable) としてチェックし、[入力/出力] タブで集計 ( Column) から列を選択しました。

using System;
using System.Data;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;

/// <summary>
/// This is the class to which to add your code.  Do not change the name, attributes, or parent
/// of this class.
/// </summary>
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
    long memberVariable;

    /// <summary>
    /// Can update the package's Variable here
    /// </summary>
    public override void PostExecute()
    {
        base.PostExecute();
        //this.Variables.ExternalVariable = this.memberVariable;
    }

    /// <summary>
    /// Assign a row's value to the class level variable.
    /// Cannot assign to the 
    /// </summary>
    /// <param name="Row">The row that is currently passing through the component</param>
    public override void Input0_ProcessInputRow(Input0Buffer Row)
    {

        this.memberVariable = Row.Column;
        // this results in a runtime error
        // The collection of variables locked for read and write access is not available outside of PostExecute.
        //this.Variables.ExternalVariable = 1111L;
    }

}
于 2013-05-07T03:09:08.837 に答える