【SSIS】ヘッダ付きのCSVにデータを追記する

データフローの「フラットファイル変換先」ではファイルを上書きするかどうかの選択をすることが出来ます。

Appendも出来るんだーと思ってうっかりチェックを外すと場合によっては痛い目を見ます。

特に何にもせずに実行した場合

例えばこんなINPUTのデータがあったとします。

hoge,piyo
1,4
2,5
3,6

この項目[hoge]を下記のようなCSVの[test]というヘッダにマッピングしてみます。OUTPUTのファイルは既にあるものとします。

test
7
8

フラットファイル変換先エディターで「ファイル内のデータを上書きする」というチェックをはずして実行すると、こんな感じになります。

test
7
8
test
1
2
3

こんな風に、ヘッダも一緒に追記されてしまいます。この仕様で通した人は気が狂っていたのでしょうか。

対処法

考え方としては、「ファイルがなかったらヘッダありで、あったらヘッダなしで出力するようにする」って感じです。

まずはファイルの有無を調べます。スクリプトタスクです。適当な変数をBooleanで作って受け取りましょう。

Dts.Variables["isFileExist"].Value = File.Exists(@"ファイルパス")

受け取った変数をOUTPUTに使うフラットファイル接続マネージャーの「ColumnNamesInFirstDataRow」というプロパティに入れてあげます。Expressionから設定出来ます。

!@[User::isFileExist]

これで終わりです。お疲れ様でした。

再実行

これでちゃんとこんなデータが出てくるはずです。

test
7
8
1
2
3