質問: ### 前提・実現したいこと SQL Server Integration Service(SSIS)にて、 データフロータスク ┗フラットファイルソース ↓ スクリプト コンポーネント ↓ OLE DB 変換先 というフローを作成しており、 スクリプトコンポーネント内では処理対象になっておらず、 OLE DB 変換先のマッピング内で直接フラットファイルソースからマッピングしている列にて、問題が発生しています。 DB:SQL Server 2008 ### 発生している問題・エラーメッセージ 列 ORT01(varchar 40)に対し、 "Kyongi-do Goyang-si Ilsanseo-gu" を挿入すると、以下のメッセージが発生し、 ``` エラー: 0xC0202009 (データ フロー タスク, OLE DB 変換先 [167]: SSIS エラー コード DTS_E_OLEDBERROR。OLE DB エラーが発生しました。エラー コード: 0x80004005。 OLE DB レコードを使用できます。ソース: "Microsoft OLE DB Provider for SQL Server" Hresult: 0x80004005 説明: "リンク サーバー '(null)' の OLE DB プロバイダー 'STREAM' から、列 '[!BulkInsert].ORT01' に無効なデータが返されました。"。 ) ``` "Kyongi-do Goyang-si Ilsanseo-gu" に変更(最初のKを半角から全角に変更)すると、エラーが発生せず、INSERTが成功します。 また、 "511弄4号1304室" においても同様の問題が発生し、 "511弄4号1304室" に変更すると問題なく登録できています。 他のデータにも、半角と全角の組み合わせを持つものや、半角のみ、全角のみのデータがあり、それらはエラーが発生していません。 何か思い当たることがあれば、ご教授ください。 宜しくお願いします。
回答: varcharなので半角数字換算で40文字まで、半角はShiftJISで2バイトと仮定したとき 正常なデータはKyongi-do Goyang-si I まで入ると思います。 半角が混在したことで文字列の長さが奇数になったときに、自動判定(あふれた部分の切り捨て、エンコードの解釈)がうまくいっていないのかもしれません。 ・半角にする文字の数を変えた(1文字でなく2文字を半角に)場合はどうなりますか。 ・データ型をvarcharからnvarcharにした場合 ・カラムの幅を255や1000など余裕のある長さにした場合 ・テキストファイルのエンコーディングや改行コードはどうでしょうか。 Management Studioのインポート/エクスポートウィザードと内部的に同じとすれば カラムの幅やエンコーディングの自動解釈はあまり賢い動作をしてくれませんので 地道に試行錯誤が必要です。 bcp.exe/sqlcmd.exeのBULK INSERT相当とすればvarcharのままでカラム幅を長く取るのが簡単です。