0

BeginDate フィールドを持つ契約テーブルがありますが、SQL Server 2000 データベース (クリンジ) に終了日がありません。2008 環境で設計された SSIS パッケージを使用して、このテーブルからデータ ウェアハウスのステージング データベースにデータを移動しています。終了日を計算する必要があります。

終了日は、顧客の次の契約開始日から 1 日を引いた日です。

SQL Server 2000 以外では、これは CTE で十分簡単に​​実行できます。行番号を使用してセットにマージする 1 つの戦略を使用しましたが、ここでは機能しません。

私の戦略は、データソース コンポーネントを介して日付を取得することです。このようなもの:

SELECT CustomerId, ContractStartDate FROM Contracts

次に、スクリプト コンポーネントを使用して ProcessInput メソッドをオーバーライドし、結果セットをループ処理して終了日を出力値として追加します。

これは哀れな方法のように思えますが、私の制約を考えると、おそらく最良の方法です。他のオプションを考えられる人はいますか?

4

1 に答える 1

1

さらに調査した結果、入力バッファを自由にトラバースすることはできないことがわかりました。

解決策は、質問に対して少し直感に反しています。次の行を特定して変更する代わりに、前の値に基づいて現在の行を変更することが最善の方法です。これは、顧客 ID 内の最大の日付から最小の日付までデータを評価する必要があることを意味します。

継続性のために、元の質問のコンテキスト内で例を保持します。

スクリプト コンポーネントの入力データがあるとします。並べ替えコンポーネントを追加して、レコード セットを並べ替えCustomerID、次にContractStartDate降順で並べ替えます。

次に、スクリプト コンポーネントで、入力値としてCustomerIDandContractStartDateを追加ContractEndDateし、出力値として追加します。

をオーバーライドしInput0_ProcessInputRowます。これを行うコードはデフォルトで生成されます。

いくつかのプロパティを追加して、前の開始日と前の顧客を追跡し、前の行に基づいて現在の行の終了日の値を設定します。

スクリプトは次のようになります。

public DateTime? PreviousRowStartDate { get; set; }
public string PreviousRowCustomerID { get; set; }
public int KnownContractPeriod { get; set; }
int defaultContractPeriod = 12;

public override void Input0_ProcessInputRow(Input0Buffer Row)
{
    if (PreviousRowCustomerID == Row.CustomerID)
    {
        Row.ContractEndDate= PreviousRowStartDate.Value.AddDays(-1);
    }
    else
    {
        Row.ContractEndDate= Row.ContractStartDate.AddMonths(defaultContractPeriod).AddDays(-1);
    }
    PreviousRowCustomerID = Row.CustomerID;
    PreviousRowStartDate = Row.ContractStartDate;
}

これは、最初の契約 (最新の顧客) を処理するときに破綻します。このため、デフォルトの契約期間を含めました。

この問題は実際に私を苦しめる可能性がありますが、ここでのほとんどの契約は 12 か月の長さであるため、現時点で言うのは困難です.

于 2013-05-20T12:25:38.653 に答える