システムエンジニア3年目にして初めてCSVファイルをSQL Serverにインポートしました。
思いのほか時間がかかったので備忘録のために手順とつまづいた点を書き残しておきます。
やりたいこと
- 売上実績を出力したCSVファイル(約30万行)を既存のデータベース登録したい
※ ただし、データ件数が多いためBULK INSERTできない - CSVファイルは月ごとに分かれているので、年度ごとに分けてテーブルを作成してインポートしたい
実際にやったこと
BULK INSERTであればすぐに対応できましたが、今回データ件数が多いためエラーになってしまいました。
そのため今回はSSMSのデータインポートツールを使用してデータインポートを行いました。
SSMSのインポートは大きく分けて2つの段階に分けて取込が行われます。
① CSVファイルからのデータの読み取り
② テーブルへのデータ投入
以下、実際の手順です。
① データ確認
まずはCSVファイルにどのようなデータが含まれているのかざっと確認する。今回はサンプルとして下記のようなデータをインポートするものとする。
ID,単価,個数,合計金額は「数値」、名称,カテゴリは「文字列」である。
ファイル形式がCSVの場合、コンマを含むデータがあるとエラーになる。
そのため、該当する行は別途Excelファイルとして取り込む等の対応が必要。
② 変換元データの設定
データのインポートにはSSMSのインポートツールを使用する。
(対象のDBを右クリック > タスク > データのインポート を選択)
データソース選択 画面
データソースを選択する。
今回のデータソースはCSVファイルなので[Flat File Source]を選択する。
「参照」ボタンを押下して対象のCSVファイルを選択する。
画面左部のメニューで「詳細設計」を選択し、取り込むデータの詳細設定を実施する。
列ごとの取り込み条件を設定する。
項目名 | 内容 |
ColumnDelimiter | 列の区切り記号 |
ColumnType | 列の形式(区切り形式/固定幅形式/幅合せなし) |
ImputColumnWidth | 入力するデータ長(コンマ等で区切られている場合は0) |
DataPrecision | 数値データの桁数 |
DataScale | 数値データの小数点以下の精度 |
DataType | インポートするデータの型 |
OutputColumnWidth | インポートした値の出力データ長 |
TextQualified | テキスト修飾子の有無 |
[OutputColumnWidth]を適切に設定しないと取込実行時にエラーになる。
CSV側の取込データ長(byte)以上になるように指定する。(例:2バイト文字で「りんご」の場合「6」以上必要)
③ 変換先テーブルの設定
変換先の選択 画面
データのインポート先を選択する。
今回はSQLserverへの取込のため、[SQL Server Native Client 11.0]を選択し、取込先のサーバー名とデータベースを選択する。
コピー元のテーブルおよびビュー 画面
コピー元のファイルおよび変換先のテーブルを確認し、「マッピングの編集」ボタンを押下する。
開かれたウィンドウで変換先テーブルの列ごとのデータ型を決定する。
データソースの選択画面で選択したデータ型と一致していないと、取込時にエラーになる恐れがある。(例:「りんご」を”文字列”として取り込んだ場合は、”数値”に型変換できない)
④ 設定内容の確認
データ型マッピングの確認 画面
変換元の型と変換先の型に矛盾がないことを確認する。
パッケージの保存および実行 画面
そのまま次へ
ウィザードの完了 画面
取込完了 画面
⑤ 完了
Message列に「XX行転送されました」と出ていれば完了です。
エラーが出るようであれば、ここまでの落とし穴を再度確認してみてください。
コメント