一人アドカレ
日 | ポスト |
---|---|
1 | 一時テーブルが存在していたら削除する |
2 | 何度も使う中間テーブルに名前をつけてクエリを見やすくする |
3 | 共通テーブル式と一時テーブルの参照可能な範囲の違い |
4 | グループ毎に最大値や最小値を持つレコードを抽出する |
5 | |
6 | SQL Serverのデータインポートウィザードを使って日時データをインポートする |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 |
SQL Serverのデータインポートウィザードを使って日時データをインポートする
この記事は自身のブログを書き直したものです。
課題
SQL Serverインポートウィザードを使ってcsvのインポートを試みたところ、日時データでエラーが発生する。インポートを試みたcsvの日時データのフォーマットは次の通り。
yyyy/mm/dd HH:MM:ss.fff
年月日はスラッシュで句切られ、時分秒はコロンで句切られている。また、年月日と時分秒の間は半角空白1つ。
上記のフォーマットの日時データを含むcsvをSQL Serverインポートウィザードを使ってインポートしようとすると、エラーが発生する。
エラー 0xc02020a1: データ フロー タスク 1: データ変換に失敗しました。列 "YMDHMS" のデータ変換から、状態値 2 と状態を示すテキスト "データが失われる可能性があるため、値を変換できませんでした。" が返されました。
(SQL Server インポートおよびエクスポート ウィザード)
準備
実行環境
- SQL Server 2017 Standard
- SQL Server Management Studio 2017
サンプルデータ
データを挿入するためのテーブル
CREATE TABLE [target_tbl] (
[name] VARCHAR(5) NOT NULL
, [some_date_time] DATETIME NOT NULL );
INSERT INTO [target_tbl] ( [name], [some_date_time] )
VALUES ( 'taro', '1999/10/11 10:20:30' );
name | some_date_time |
---|---|
taro | 1999-10-11 10:20:30 |
テーブルに挿入するデータ
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
解法
エラーはどうも日時データをインポートするときの日時データのフォーマットが異なるために起きているようだ(メッセージからはよくわからないのだが)。
インポート時のフォーマットを確認する。
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インポートウィザードはフォーマットに正確に従わないといけない。
つまりはデータや資料をしっかり確認しましょうということですね。気をつけよう。