とりあえず半歩

学んだことを1日1個、簡単なことでも良いから記録していきたい。

SQL Serverのデータインポートウィザードを使って日時データをインポートする

課題

SQL Serverインポートウィザードを使ってcsvのインポートを試みたところ、日時データでエラーが発生する。その理由を探った。(簡単だった)

実行

csv内の日時データのフォーマットは次の通り。

yyyy/mm/dd HH:MM:ss.fff

年月日はスラッシュで句切られ、時分秒はコロンで句切られている。また、年月日と時分秒の間は半角空白1つ。

上記のフォーマットの日時データを含む、例えば次のようなcsvSQL Serverインポートウィザードを使ってインポートしようとすると、エラーが発生する。

Name,YMDHMS
hoge,2015/10/15 21:00:00.000
fuga,2015/10/15 22:00:00.000
piyo,2015/10/15 23:00:00.000

エラー 0xc02020a1: データ フロー タスク 1: データ変換に失敗しました。列 "YMDHMS" のデータ変換から、状態値 2 と状態を示すテキスト "データが失われる可能性があるため、値を変換できませんでした。" が返されました。 (SQL Server インポートおよびエクスポート ウィザード)

このエラーはどうも日時データをインポートするときの日時データのフォーマットが異なるために起きているようだ。
(メッセージからはよくわからないのだが)

インポート時のフォーマットを確認する。

Integration Services Data Types

上記ページのConverting Between Strings and Date/Time Data Typesの項目を見ると、次のようなフォーマットでなければならないとのことだ(DT_DNTIMESTAMPの場合)。

yyyy-mm-dd hh:mm:ss[.fff]

さきほどのcsvファイルの日時データのフォーマットを上のフォーマットに直してもう一度SQL Serverインポートウィザードを使ってインポートすると成功する。

評価

CONVERT関数やCAST関数はスラッシュ形式の日時データだって変換できるのだが、SQL Serverインポートウィザードはフォーマットに正確に従わないといけない。

つまりはデータや資料をしっかり確認しましょうということですね。気をつけよう。