質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Q&A

解決済

1回答

15243閲覧

SQL Server CSVファイルのBULK INSERTで変換エラーが起きる

tyai

総合スコア5

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

0グッド

0クリップ

投稿2021/11/24 08:11

編集2021/11/24 08:23

前提・実現したいこと

SQL Serverで、CSVファイルをBULK INSERTしたいのですが、下記のようなエラーがでます。
「行 1、列 4 の一括読み込みデータ変換エラー (型の不一致または指定されたコードページでは無効な文字)。」

改行コードが原因と思われますが、指定はちゃんとしてあり、文字コードも問題なさそうですが、何が原因なのでしょうか?

【csv内容】
(1~3列目 省略させていただきます)
(4列目)150101
(5列目)改行コード

カンマ区切り(4列目の5列目の間はなし)
クォーテーションやTABなどはなし

【テーブルの型】
すべてnvarchar

発生している問題・エラーメッセージ

「行 1、列 4 の一括読み込みデータ変換エラー (型の不一致または指定されたコードページでは無効な文字)。」

該当のソースコード

SQL

1BULK INSERT 2 [bulkInsertTest].[dbo].[Sales] 3FROM 4 'D:\bulkInsertTest\csvData.csv' 5WITH( 6 DATAFILETYPE = 'char' 7 ,FIELDTERMINATOR = ',' 8 ,ROWTERMINATOR = '\n' 9)

試したこと

ROWTERMINATOR = '\n'

上記の「\n」を「\r」「\r\n」に変えてみましたが同じエラーでした。

また、SQL Server2017以降のため、
with句を「FORMAT = 'CSV'」に変えてやりましたが、今回のエラーが原因でエラーが出てしまうようです。
エラーメッセージ
「行 1、列 4 のCSVデータファイル (ファイル名)の列名が無効であるため、一括読み込みが失敗しました。…(略)」

補足情報(FW/ツールのバージョンなど)

SQL Server2019

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

SQL Serveer 2019 環境で試してみました。
以下のテストデータとテーブルであれば BULK INSERT が行えることを確認しました。

■ テストデータ

CSV

1aaa,bbb,ccc,150101 2eee,fff,ggg,150100

SQL

1CREATE TABLE tb_test 2( 3 field1 NVARCHAR(100), 4 field2 NVARCHAR(100), 5 field3 NVARCHAR(100), 6 field4 NVARCHAR(6) 7)

■ テスト1:FORMAT オプション未使用

SQL

1BULK INSERT 2 [dbo].[tb_test] 3FROM 4 'C:\home\edu\teratail\questions\370798\test.csv' 5WITH( 6 DATAFILETYPE = 'char' 7 ,FIELDTERMINATOR = ',' 8 ,ROWTERMINATOR = '\n' 9) 10

■ テスト2:FORMAT オプション使用

SQL

1BULK INSERT 2 [dbo].[tb_test] 3FROM 4 'C:\home\edu\teratail\questions\370798\test.csv' 5WITH( 6 FORMAT = 'CSV' 7)

■ 実行結果
イメージ説明

型の不一致または指定されたコードページでは無効な文字)

同様のエラーが出るケースとしては、CSV のデータがテーブルの列数を超過していた場合に同様のエラーが出ることを確認しました。(上記のケースだとテーブルの4列目が6桁ですが、CSVで7桁のデータを取り込もうとするとこのエラーが出るようでした。)

<参考>
■ SQL Server で BULK INSERT をつかってcsvなどのデータを取込む方法
https://qiita.com/fuk101/items/d98716a48d69d5c7f1a7

投稿2021/11/24 14:09

cx20

総合スコア4633

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tyai

2021/11/25 01:01

テストまでありがとうございます!エラー原因を特定いただき本当に感謝です!
cx20

2021/11/25 03:23 編集

桁数超過は一例として記載しましたが、質問者さんのエラーの原因も桁数超過だったのでしょうか?(単純に気になっているだけです)
tyai

2021/11/27 15:02 編集

遅くなってしまい申し訳ございません。 桁数超過が原因でした。 改行コードが認識されないことにより、2行目以降のデータを1列目の行4に取り込もうとするため、入りきらずにエラーが出ていました。 結局BULK INSERTでの取り込みは諦め、bcp取り込みに変更し、fmtファイルで改行コードを行4の中に含む形で指定してあげることで解決いたしました。
cx20

2021/11/27 15:29

桁数超過だったとのこと、了解しました。 ちなみに、 誤)1列目の行4 正)1行目の列4 でしょうか?(読んでいて少し気になったので・・)
tyai

2021/11/29 14:17

その通りです。間違い失礼いたしました。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問