SSIS で Unicode 文字列を Shift-JIS の文字コードとしてテキストファイルに出力する

概要

SSIS (SQL Server Integration Service) において、Shift-JIS で使用できない文字を Shift-JIS の文字コードでテキストファイルに保存しようとするとエラーになります。対応策として使用できない文字を「?」に変換してテキストファイルに出力する方法について説明します。

動作環境

SQL Server SQL Server 全般

動作確認環境

SQL Server
  • SQL Server 2008 R2
  • SQL Server 2014 CTP2

内容

エラーになるパターン

SQL Server 上のテーブルの nvarchar 型の列に Shift-JIS では使用できない文字列を持っているものとします。 ちなみにこれらの文字を varchar の列に入れると右側にある「ColumnShiftJis」列のように使用できない文字が ? に置き換わります。

Unicode 文字をデータベースのテーブルに入れる

SSIS 上で図のように先ほどのテーブルからデータを読み込み、 テキストファイルに出力するようにフローを組みます。

テキストファイルへ出力する様にフローを構築

CSV ファイルとして出力するものとします。CSV ファイルでは Shift-JIS がよく使われるので、テキストファイルの文字コードを Shift-JIS に設定します。

文字コードを Shift-JIS に設定

この設定で実行すると出力のタイミングでエラーになります。

テキストファイル書き込み時にエラー

次のようなエラーメッセージが表示されます。

エラー内容

出力されたファイルもエラーが発生した時点の中途半端な個所で途切れてしまいます。

出力されたテキスト

そのまま出力しようとするとエラーになってしまうため、試しに途中に「データ変換」を組み込みます。

データ変換 追加

データ型を「DT_WSTR」から「DT_STR」に変換し、Shift-JIS に出力できる形にします。

「DT_WSTR」から「DT_STR」に変換

しかしこちらも実行するとエラーになります。SSIS ではデータが欠落するような暗黙処理は厳密にエラーにしてしまうためです。 もし SSIS 上でテキストの型落ちするような処理を実行させたい場合は、すべての文字に対して明示的に文字の置換処理を指定しないといけないでしょう。

データ変換エラー

対応策

データベースのテーブルからの読み込み時点で SQL を使用してテキストの型を変更する方法があります。 SQL であれば実行するのは SSIS ではなく SQL Server のエンジンになるため、エラーなく実行できるようになります。 ちなみに Shift-JIS で使用できない文字はすべて「?」に変換されます。 これは SQL Server 側の仕様です。 SSIS でなくても SQL Server を使うシステム全般で同様の結果になります。

ADO NET 変換元を開き、データ アクセス モードを「SQL コマンド」に変更します。すると SQL を入力できるようになるので、データベースからデータを取得する Select 文を記述します。その時 Shift-JIS で使用できない文字が含まれているテキストを cast を使用して強制的に varchar に変換します。

SQL で varchar に変換

SSIS にデータが流れる時点ですでに Shift-JIS で使用できない文字が除去されているため、そのまま処理を通すことができます。

処理成功

CSV に正常にテキストが書き込まれていることがわかります。また Shift-JIS で使用できない文字はすべて「?」に変換されていることがわかります。

出力されたテキスト