Question

Naxima on Thu, 25 Sep 2014 10:45:08


「毎月、先月の販売データを、DWHにロードする」という処理を行いたいです。

毎月の実行は、SQL Serverエージェントで、ジョブをスケジュール実行することを考えています。

スケジュールに従って実行される時に、「先月分」という条件を動的に生成することができないでしょうか?

起動するSSISパッケージには、パラメータ「期間開始日」「期間終了日」が作成済みです。

例えば、2014年9月の実行時に、SQL Serverエージェントで

先月の1日(=2014/08/01)と、今月の1日(2014/09/01)を生成し

SSISパッケージ内のパラメータに、以下のように渡した上で実行したいです。

  期間開始日=2014/08/01、期間終了日=2014/09/01

その後、SSISパッケージ内のデータフロー中で、抽出の条件で

 期間開始日<=販売日<期間終了日

のようにすることで、先月販売されたデータを毎月ロードすることを考えています。

このようなことは、可能でしょうか?

不可能な場合、期間生成&他パッケージ実行用の、パッケージを作ればできそうだとは思っていますが

まず、SQL Serverエージェント(またはほかのSQL Server機能)で簡単かつグラフィカルに可能かどうか

教えていただけないでしょうか。

データ抽出範囲のパターンとしては

N日前の1日分(※Nは設定可能)、先月分、2か月前の1月分、先月を含めた過去1年分

というパターンは用意したいです。

パターンごとに設定作業が必要になるのは問題ないですが、スケジュール実行される側のパッケージを

パターンごとに作成するのは避けたいです。

よろしくお願いいたします。




Sponsored



Replies

nagino - 引退エンジニア on Thu, 25 Sep 2014 17:35:48


単純に SSIS の中でデータ取得するクエリの WHERE 句に
WHERE CONVERT(DATE, DATEADD(d, 1 - DAY(GETDATE()), GETDATE())) <= 販売日
AND 販売日 < CONVERT(DATE, DATEADD(d, 1 - DAY(GETDATE()), DATEADD(m, 1, GETDATE())))
とするのが手っ取り早いと思いますが、そうではなく SSIS パッケージにパラメータとして外部から渡す必要があるということでしょうか?

Naxima on Tue, 30 Sep 2014 14:06:01


回答ありがとうございます

ご提示の方法ですと、「先月分」のみしか処理できないと思います。

エラーがあった場合など、2か月前のデータを処理したいと思った時に

パッケージを修正するのではなく、外から与えるパラメータで

期間を指定できればと思っております。

nagino - 引退エンジニア on Tue, 30 Sep 2014 15:49:53


なるほど、意図は理解しました。

SSIS はどうもパッケージ単体で独立している構成が基本のようで、実行時に動的な引数を渡すのはあまり特異ではない印象です。
一応機能はあって、たとえばエージェントのジョブで dtexec によって SSIS パッケージを起動しているなら、引数での指定ができます。
以下のページの /SET PropertyPath;value という構文で設定できます。
http://technet.microsoft.com/ja-jp/library/ms162810(v=sql.105).aspx
エージェントのジョブにする場合は引数が固定文字列になるので、ここで渡す引数を何ヶ月前かという数値にしておいて通常は 1 としておき、SSIS 内でそこから開始日、終了日を生成するというのが 1 つの手かと思います。