Transact-SQLのBULK INSERTでエラーをキャッチしたい

このQ&Aのポイント
  • Transact-SQLのBULK INSERTでエラーを発生させた場合の処理方法について教えてください
  • BULK INSERTのエラーキャッチ方法やエラー処理の代替方法について教えてください
  • Transact-SQLのBULK INSERTのエラー処理に関して質問があります
回答を見る
  • ベストアンサー

Transact-SQLのBULK INSERTでエラーをキャッチしたい

・環境 WindowsXP Pro SQL Server2005 はじめまして。 Transact-SQLのBULK INSERTで、エラー(ファイルが存在しない等)が発生した場合に、専用の処理を行いたいと思っています。 ※BULK INSERTでエラーが発生したら、リターンコード100を返す等の処理を行いたいと思ってます 私の方で試したのは、BULK INSERTをBEGIN TRYでネストしエラーキャッチを行おうと思いましたがキャッチできず困っております。 以下、質問させてください。  ・BULK INSERTのエラーはエラーキャッチできないのか?できる場合その方法は?  ・エラーキャッチできない場合、他の方法でBULK INSERTエラー時の処理を行う方法はあるのか? お手数ですが、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

ファイルの読み込み時エラーであれば捕捉できるはずですが、ファイル不存在などの場合は、リンクページの「ステートメントレベルの再コンパイルで発生するエラー (コンパイル後の名前の遅延解決により発生するオブジェクト名の解決エラーなど)」に相当するため、捕捉できないのだと思います。 したがって、以下のように動的クエリにすればよいです。 なぜこれだとOKなのかも、リンクページに書いてあります。 DECLARE @sql varchar(max) BEGIN TRY SET @sql='BULK INSERT TABLE1 FROM ''C:\AAAAA.txt'' WITH (ROWTERMINATOR=''\n'')' EXEC (@sql) END TRY BEGIN CATCH SELECT ERROR_NUMBER(),ERROR_MESSAGE() END CATCH

参考URL:
http://technet.microsoft.com/ja-jp/library/ms175976.aspx
keita_ueue
質問者

お礼

早速なご回答ありがとうございます。 上記、ソースで試したところ無事にエラーキャッチする事ができました。

関連するQ&A

  • TRANSACT-SQLでのシステムエラーの検知

    TRANSACT-SQLで下記のような処理を記述したとき、 (1)~(3)で起きたシステムエラーの検知はCATCHで共通的に行えますか? TRY  SELECT処理  ↓  エラー発生(1)  ↓  INSERT処理  ↓  エラー発生(2)  ↓  UPDATE処理  ↓  エラー発生(3) CATCH  GOTO 異常終了処理 END COMMIT :異常終了定義 ログ出力(エラーメッセージ) ロールバック ※エラー処理は、テーブルがDROPされていた、ディスクが破損したなどの通常は発生しないエラーが起きた場合を想定しています。 ※エラーメッセージはステートメントが最終の処理の結果を持ってくれていて、その取得方法があると思っています。 もし実現できなかったり、実現出来たとしても問題があるようであればご指摘頂きたく存じます。

  • BULK INSERTのエラー取得は可能なのでしょうか?

    こんばんは。 お世話になります。 SQL Server初心者です。 現在、CSVファイルに出力された他のデータベース(Paradox)のデータをSQL Server2005に移行するためのツールを作成しています。 Paradoxでは、以下のように、(1)と(2)のレコードが存在した場合、重複エラーとならなかったのですが、SQL Serverでは、当然ながら、重複エラーとなってしまいます。  (1)aaaaa, 1, あいうえお  (2)AAAAA, 1, かきくけこ  ※aaaaaとAAAAAが主キーの場合 CSVファイルのレコードは、多いもので700万件も含まれ、これを1行読み込み、既存データか否かをチェックし、既存の場合はINSERTしないという処理を700万回繰り返すと、相当な時間がかかり、性能向上を求められています。 そのため、BULK INSERTを使用する方向で検討してみました。 しかし、CSVファイルに主キー重複したレコードが存在すると、エラーが返されますが、BULK INSERTでは、どのレコードでエラーになったかまでは取得することができません。 ずいぶん、調べてみたのですが、無理のようでした。 BULK INSERTでエラーとなる箇所を特定する方法は本当にないでしょうか? もし、無理ならば、何か他にエラー箇所を特定して速くINSERTするコマンド、方法はないでしょうか? お知恵をお借りしたく、よろしくお願いいたします。

  • TRY CATCHでシステムエラーを検知できない

    TRY CATCHをネストさせた状態で、 テーブルがドロップされていることを検知するにはどうすればよいでしょうか? BEGIN TRY   ★   BEGIN TRY     ▲   END TRY   BEGIN CATCH   END CATCH CATCH END CATCH としているときに、 ★の位置だとテーブルのドロップはCATCH できるのですが ▲の位置だとテーブルのドロップはCATCH できないようですが、 テーブルがドロップされていることを検知するにはどうすればよいでしょうか?

  • SQL SERVERの BULK INSERT

    SQL SERVERの BULK INSERTについて。 TESTというテーブルにtest.csvをBULK INSERTによりデータをインポートしようとしているのですが変数を使わずに下記のように書くと正常に動くのですが、 BULK INSERT TEST FROM 'C:\data\test.csv' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ) 変数を使って下記のようにすると「不適切な構文があります。」とエラーとなってしまいます。 DECLARE @data varchar(100) SET @data = 'C:\data\test.csv' BULK INSERT TEST FROM @data WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ) 解決策を教えてください。

  • BULK INSERTについて

    CSVをバルクインサートでitemテーブルにBULK INSERTする際に、 下記のようなSQL文を使っているのですが、CSV内のブランク文字は 実行後にNULLになってしまいます。 やりたいことはNULLではなく空白文字("")にしたいのですが、 下記のSQL文をどのように変えればよいのでしょうか。 または、CSVを変更する方法でもよいです。 BULK INSERT item FROM 'c:\test.txt' WITH ( FIELDTERMINATOR = ',', ROWTERMINATOR = '\n' ); 大変お手数ですが、 わかる方がいらっしゃいましたらよろしくお願いいたします。

  • SQL Server 2000 - bulk insert

    SQL Server 2000でのbulk insert とはどういうものなのでしょうか? csvなどをテーブルに一括で更新できてしまうものでイメージはよいのでしょうか?csvにヘッダーがある場合除くなどもできたりするのでしょうか? できれば、具体的なコマンドの書き方もご教示ください。 よろしくお願いします。

  • SQLの重大度エラーがうまく検知できません

    お世話になっています。 WindowsXP(SP3)、SQL2005(SP3)、VB6.0(SP6)で開発を行っています。 今、データベースにINSERTするトリガを作成していますが、TRY-CATCHがうまくいきません。今現在のコードは、次のようになっています。 ---コードはじめ DECLARE @ERR VARCHAR (2000) DECLARE @STR VARCHAR (2000) DECLARE @res int begin try EXEC @res = sp_executesql N'INSERT INTO TEST (SEIYMD,ZENYYYYMM,STYMD,SIMEBI) VALUES (null,0,0,0)'     if @res<>0 begin     raiserror('テストエラー1',11,1) end end try BEGIN CATCH     raiserror('テストエラー2',11,1) END CATCH ---コード終わり ここで、TEST(SEIYMD,ZENYYYYMM,STYMD,SIMEBI)は、すべてnumeric型で、null型を認めていません。 調べたところ、これでCATCHステートメントへ飛ぶようになると思うのですが、うまくいきません。 この原因、対策等を知っていましたら、ご教授ください。お願いいたします。

  • BULK INSERTで失敗

    いつも拝見させて頂いております。 今回はSQLServerのBULK INSERTについて質問させていただきます。 現在、UNIXから出力されたデータファイルをWindows2000Serverにて ストアドからBULK INSERTを使用して取り込もうとしています。 ですが、うまく取り込めず困っています。 現在は『BULK INSERT TBL名 FROM 'サーバ内のファイル'』として クエリアナライザからも実行しているのですが、最後のカラムで 桁あふれとなりエラーが発生してしまいます。 行終端文字が認識できず、全てのデータが1行とみなされているようです。 しばらく、調べているのですが調べれば調べるほど正常に取り込めなければ おかしいと思ってしまっています。 以下が現在の状況です。 1.BULK INSERTの行終端文字のデフォルトは\n(LF)であり、   取り込もうとしているデータファイルの行終端文字も\n(LF)である。 この状況であれば取り込めるかカラムのデータ型不一致等のエラーまで進むと思っているのですが、そこまで進みません。どなたかこのような状況を経験したら方が いらっしゃいましたらご教授いただきたく存じます。 宜しくお願い致します。

  • BULK INSERTで失敗

    SQL Server2000のSQL クエリアナライザから、 BULK INSERTを行おうとすると 以下のエラーメッセージが出力されます。 ------------------------------------- サーバー : メッセージ 7302、レベル 16、状態 1、行 1 OLE DB プロバイダ 'BULKIMPORTSTREAM' のインターフェイスを作成できませんでした。 OLE DB エラー トレース [Non-interface error: CoCreate of DSO for BULKIMPORTSTREAM returned 0x8007045a]。 ------------------------------------- 何が不足しているのでしょうか.

  • BULK INSERT カンマ区切り

    以下のようなカンマ区切りのCSVファイル "aaa","bbb","cccc" をMSDEにインポートしたいと考えており、バッチでosqlを利用してBULK INSERT処理をしています。 CSVファイルには以下のように「,」、「"」も入る可能性があります。(「"」の場合は「""」で入る) "aa,a","b""bb","cccc" このような場合、BULK INSERTで可能な方法はありますでしょうか。 バッチのみで実行することが条件です。 ご存知の方がいましたらご教授頂けると幸いです。