- PR -

SQL ServerのBULK INSERTについて

1
投稿者投稿内容
くろ
会議室デビュー日: 2005/03/01
投稿数: 13
投稿日時: 2007-01-30 20:04
SQL Server 2005でBULK INSERTステートメントを使用して、ファイルからテーブルにデータを取り込むクエリを作成しています。

取り込みの際に、BULK INSERTのフォーマットファイルを使用して形式チェックをおこなっているのですが、形式に一致するレコードと一致しないレコードが混在するファイルを取り込むと、一致するもののみがテーブルに取り込まれます。

ファイルに形式が一致しないデータが含まれる場合(エラーが発生した場合)は、すべてのデータを取り込まないようにする方法はありませんか。

なお、BULK INSERTのBATCHSIZEやROWS_PER_BATCHオプションを変更して試してみたのですが、特に変化はありませんでした。

よろしくお願いします。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2007-01-30 23:51
リファレンスを読む限りMAXERRORSあたりがくさいところですけど、ためしましたか?

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/tsqlref/ts_ba-bz_4fec.asp
くろ
会議室デビュー日: 2005/03/01
投稿数: 13
投稿日時: 2007-01-31 14:00
burton999さん
早速のご回答ありがとうございます。

MAXERRORSは0に指定していますが、影響していない?ようです。

また、その他に指定しているオプションは、FORMATFILE、TABLOCKです。
NAO
ぬし
会議室デビュー日: 2001/10/24
投稿数: 1256
お住まい・勤務地: 神奈川のはずれから東京の下町
投稿日時: 2007-01-31 14:20
MAXERRORSは
引用:

一括コピー操作を取り消す前に発生することのできる最大エラー数を指定します。一括コピー操作でインポートできない行は無視され、エラーとしてカウントされます。max_errors を指定しない場合、既定値は 10 です。


なのでおそらく意味は無いですね。

BULK INSERTを使うストアドプロシージャを作るしか無いと思います。
(デフォルトでSQL Serverのsp_で始まるシステムのストアドプロシージャにあるかもしれませんが。)

ストアドプロシージャで
変数を宣言して、MAXERRORSが1でも発生した場合に
ROLLBACK TRANSACTION
0だったら
COMMIT TRANSACTION

って感じで作らないと無理だと思います。

くろ
会議室デビュー日: 2005/03/01
投稿数: 13
投稿日時: 2007-01-31 18:54
NAOさん

BEGIN TRAN 〜 COMMIT TRANでくくってエラー対応したところ、
うまくできました。

ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)