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

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

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

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

Q&A

解決済

1回答

34090閲覧

SQL Server 2017 BULK INSERTでエラーが発生する

gysnet

総合スコア18

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

0グッド

1クリップ

投稿2019/03/24 01:02

編集2019/03/24 05:00

こんにちは。
もしご存知の方がいらっしゃいましたらアドバイスをいただけたら幸いです。

対象データベースは、SQLServer 2017です。PCのOSはWindows10です。
"|"区切りのテキストデータを、BULK INSERTでテーブルに取り込みたいのですが、
BULK INSERT実行時に以下のエラーが発生します。

■エラーの内容:

メッセージ 4832、レベル 16、状態 1、行 1
一括読み込み: データ ファイルで予期しないファイルの終了が検出されました。
メッセージ 7399、レベル 16、状態 1、行 1
リンク サーバー "(null)" の OLE DB プロバイダー "BULK" により、エラーがレポートされました。プロバイダーからエラーに関する情報を取得できませんでした。
メッセージ 7330、レベル 16、状態 2、行 1
リンク サーバー "(null)" の OLE DB プロバイダー "BULK" から行をフェッチできません。

■実行したSQL:

BULK INSERT BulkInsertTest FROM 'C:\temp\bi\STORE_20190323.txt' WITH (DATAFILETYPE='widechar', FORMATFILE='C:\temp\bi\BulkInsertTest.fmt')

■取り込もうとしたデータ(STORE_20190323.txt UTF-8(BOM無) 改行LF):

00001|あ|1|N|T
00002|a|1|N|This store is already closed.

■フォーマットファイル(BulkInsertTest.fmt):

14.0
5
1 SQLCHAR 0 5 "|\0" 1 StoreCd Japanese_CI_AS
2 SQLNCHAR 0 200 "|\0" 2 StoreName Japanese_CI_AS
3 SQLINT 0 4 "|\0" 3 SeqNo ""
4 SQLCHAR 0 1 "|\0" 4 DlvStatCd Japanese_CI_AS
5 SQLNCHAR 0 400 "\n\0" 5 DlvNGRsn Japanese_CI_AS

■対象のテーブル(BulkInsertTest):

対象のテーブル(BulkInsertTest)

些細な点でも構いませんので、ご意見等いただけたら幸いです。
よろしくお願いいたします。

■テキストの中身

イメージ説明

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

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

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

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

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

guest

回答1

0

ベストアンサー

フォーマットファイルの指定の内、区切り文字の指定が合っていないようです。
|区切りということと、普通、行の区切りはcrlfですので、以下のような指定だと思います。
※\0ってlfを表現しようとした?←NULL ターミネータ (表示されないターミネータ)ですね。

項目順データ型prefix長データ長区切文字格納先項目順格納先項目名項目文字コード
14.0
5
1SQLCHAR05"|"1StoreCdJapanese_CI_AS
2SQLNCHAR0200"|"2StoreNameJapanese_CI_AS
3SQLINT04"|"3SeqNo""
4SQLCHAR01"|"4DlvStatCdJapanese_CI_AS
5SQLNCHAR0400"\n"5DlvNGRsnJapanese_CI_AS

追記

CSVがutf-8でしたね。
utf-8の場合、コードページに関しては、フォーマットファイルは指定できないようです。
※指定する場所が無いので。それ以外は問題なさそうです。
UTF-8 形式のテキストファイルを BULK INSERT で一括取り込みする( SQL Server )
【SQL】BULK INSERTのデータインポート(UTF-8)
上記を参考に以下で取り込めました。

SQL

1BULK INSERT BulkInsertTest FROM 'C:\temp\STORE_20190323.txt' 2WITH ( 3 DATAFILETYPE='char' 4, CODEPAGE = '65001' 5, FIELDTERMINATOR = '|' 6, ROWTERMINATOR='0x0A' -- 行ターミネータ LF (0x0A) 7)

投稿2019/03/24 02:19

編集2019/03/24 09:04
sazi

総合スコア25195

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

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

gysnet

2019/03/24 03:23

sazi様、ご回答ありがとうございます。 設定を修正して確認してみます。 \0は、Webサイトを検索して見よう見真似でやっていたことで、 意図はありません。 今回取り込むテキストファイルは、とある外部システムが作成するのですが、 サンプルのテキストを見たときに改行コードがLFでしたので、行ターミネータもLFでないと いけないかなと思っていました。
gysnet

2019/03/24 03:27

修正して実施してみたところ、以下のエラーに変わりました。 引き続き調べてみます。 メッセージ 4863、レベル 16、状態 1、行 1 行 1、列 1 (StoreCd) の一括読み込みデータ変換エラー (切り捨て)。
gysnet

2019/03/24 03:30

先程は、ファイル形式がUTF-8(BOM付)だったのですが、 UTF-8(BOM無)にして行うと、さらに以下のエラーに変わりました。 メッセージ 4863、レベル 16、状態 1、行 1 行 1、列 2 (StoreName) の一括読み込みデータ変換エラー (切り捨て)。
sazi

2019/03/24 03:44

質問にあるデータをコピーして確認しましたがエラーにはなりません。 Japanese_CI_ASの指定を、NCHARの属性である「StoreName」と「DlvNGRsn」のみにしてみてはどうでしょう。
sazi

2019/03/24 03:47

LFのみなら、\nで指定してみて下さい
gysnet

2019/03/24 04:31

Japanese_CI_ASの指定、\nの指定を修正して行ってみましたが、依然としてエラーとなります。 sazi様の環境では発生していないのでしたら、私の環境に原因がある可能性もありますね。 すんなりBULK INSERTの対応が入れれそうと思っていたのですが、思わぬドはまりです…。 アドバイス誠にありがとうございます。
sazi

2019/03/24 04:35

CSVの確認にはどういったエディタを使われていますか? 私はサクラエディタです。 LFやCRも記号として識別されます。
gysnet

2019/03/24 04:35

度々すみません。 以下の2つのエラーメッセージは最初のエラーに引きずられて発生しているものになりますでしょうか? ・メッセージ 7399、レベル 16、状態 1、行 1 リンク サーバー "(null)" の OLE DB プロバイダー "BULK" により、エラーがレポートされました。プロバイダーからエラーに関する情報を取得できませんでした。 ・メッセージ 7330、レベル 16、状態 2、行 1 リンク サーバー "(null)" の OLE DB プロバイダー "BULK" から行をフェッチできません。
gysnet

2019/03/24 04:37

sazi様 私もサクラエディタを使用しています。
sazi

2019/03/24 04:50 編集

LFだと、「←」で表現されているはずですがどうでしょう
sazi

2019/03/24 05:00

項目の区切りが正しくないと、 >一括読み込み: データ ファイルで予期しないファイルの終了が検出されました。 行の区切が正しくないと、 >一括読み込みデータ変換エラー (切り捨て)。 が発生しています。
gysnet

2019/03/24 05:01

質問のところにキャプチャを付けさせていただきました。 私の設定が悪いのでしょうか、↓で表示されています。
sazi

2019/03/24 05:07 編集

それだと、CRですね。 「LF」← 「CR」↓ 「CR+LF」↲ です。
sazi

2019/03/24 05:12

それと最後の空行が余計です。
sazi

2019/03/24 05:18

それから、回答の"|"は表示されるように全角で指定していますから、実際には半角で指定して下さい。
gysnet

2019/03/24 05:23

ありがとうございます。 見直してみます。
gysnet

2019/03/24 07:29

色々試しているのですが、うまくいきません。行ターミネータ、フィールドターミネータの 設定だと思うのですが、なかなか難しいですね。。
gysnet

2019/03/24 08:00

度々アドバイスをいただき誠にありがとうございます。 確認させていただきます!
sazi

2019/03/24 08:18

回答内容だと、ROWTERMINATOR が上手く指定できていませんでした。
sazi

2019/03/24 08:42 編集

追記しました。 なぜか、CRとLFを逆に指定しないと駄目でした (エディタで改行して表示されるのが↓なので、SQLSERVERが間違っているとしか思えませんが)
sazi

2019/03/24 08:46

今回は不要でしたので、フォーマットファイルは指定しませんでしたが、必要であれば指定しても問題は無いと思います。
gysnet

2019/03/24 08:49

ありがとうございます!!教えていただいた設定で無事取り込むことができました。 現在のシステムがフォーマットファイルを指定するようになっているので、 そこは要調整です。。 本当にありがとうございました!
gysnet

2019/03/24 08:50

FORMATFILE=''で行えば、影響なさそうでした。
gysnet

2019/03/24 08:51

sazi様、本当にありがとうございました。 本件につきましては、クローズさせていただきます。 後程、ベストアンサーお送りいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問