SSIS で Unicode 文字列を Shift-JIS の文字コードとしてテキストファイルに出力する
エラーになるパターン
SQL Server 上のテーブルの nvarchar 型の列に Shift-JIS では使用できない文字列を持っているものとします。 ちなみにこれらの文字を varchar の列に入れると右側にある「ColumnShiftJis」列のように使用できない文字が ? に置き換わります。
SSIS 上で図のように先ほどのテーブルからデータを読み込み、 テキストファイルに出力するようにフローを組みます。
CSV ファイルとして出力するものとします。CSV ファイルでは Shift-JIS がよく使われるので、テキストファイルの文字コードを Shift-JIS に設定します。
この設定で実行すると出力のタイミングでエラーになります。
次のようなエラーメッセージが表示されます。
出力されたファイルもエラーが発生した時点の中途半端な個所で途切れてしまいます。
そのまま出力しようとするとエラーになってしまうため、試しに途中に「データ変換」を組み込みます。
データ型を「DT_WSTR」から「DT_STR」に変換し、Shift-JIS に出力できる形にします。
しかしこちらも実行するとエラーになります。SSIS ではデータが欠落するような暗黙処理は厳密にエラーにしてしまうためです。 もし SSIS 上でテキストの型落ちするような処理を実行させたい場合は、すべての文字に対して明示的に文字の置換処理を指定しないといけないでしょう。
対応策
データベースのテーブルからの読み込み時点で SQL を使用してテキストの型を変更する方法があります。 SQL であれば実行するのは SSIS ではなく SQL Server のエンジンになるため、エラーなく実行できるようになります。 ちなみに Shift-JIS で使用できない文字はすべて「?」に変換されます。 これは SQL Server 側の仕様です。 SSIS でなくても SQL Server を使うシステム全般で同様の結果になります。
ADO NET 変換元を開き、データ アクセス モードを「SQL コマンド」に変更します。すると SQL を入力できるようになるので、データベースからデータを取得する Select 文を記述します。その時 Shift-JIS で使用できない文字が含まれているテキストを cast を使用して強制的に varchar に変換します。
SSIS にデータが流れる時点ですでに Shift-JIS で使用できない文字が除去されているため、そのまま処理を通すことができます。
CSV に正常にテキストが書き込まれていることがわかります。また Shift-JIS で使用できない文字はすべて「?」に変換されていることがわかります。