• 締切済み
  • 困ってます

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するコマンド、方法はないでしょうか? お知恵をお借りしたく、よろしくお願いいたします。

共感・応援の気持ちを伝えよう!

  • SQL Server
  • 回答数1
  • 閲覧数3959
  • ありがとう数4

みんなの回答

  • 回答No.1
  • t-ka
  • ベストアンサー率28% (14/50)

aaaとAAAを区別したいなら。データベースの照合順序を変えてみると エラーなしで処理できるかもしれません。照合順序はシステムレベル・データベースレベル・テーブルレベルで設定できます。初期設定では osの設定を引き継ぎます(この場合大文字小文字を区別しない)。paradoxで正常であれば問題なくinsertできるはず・・・

共感・感謝の気持ちを伝えよう!

質問者からのお礼

遅くなりましたが、回答ありがとうございます! 照合順序の変更を行って問題ないかを確認してみます。 まず、今から試してみます。

関連するQ&A

  • 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の 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' ) 解決策を教えてください。

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

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

  • BULK INSERT でファイルが開けなくて困っています

    初めての質問なのでトンチンカンなこと言ってたらすみません。 SQL Server 2005のストアドプロシージャを使ってBulk InsertでSQL Server とは別のパソコンにあるcsvファイルをテーブルにインポートしようとしているのですが、「...を開けなかったので、一括読み込みできません。...アクセスが拒否されました。」とエラーが出てしまいます。ストアドプロシージャは別パソコンのVB2005からパラメータ(ファイルパス等)を与えて実行しています。 ファイルの保存先フォルダは共有にしています。 ちなみにSQL Server側のパソコンからストアドプロシージャを実行するとちゃんとインポートしてくれます。 パスワードや権限が関係してるんでしょうか? 長くなりましたが、よろしくお願い致します。

  • SQL Server 2000 - bulk insert

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

  • 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で可能な方法はありますでしょうか。 バッチのみで実行することが条件です。 ご存知の方がいましたらご教授頂けると幸いです。

  • まれにinsertエラーが発生する

    VB6からWindows版PostgreSQL8.2.4へ書き込みを行っています。 まれにinsertエラーが発生する為、困っています。(2日~7日に1回) エラー時のSQLログがあり、SQL文に間違いが無いことは確認ずみです。 エラー詳細を取っておらず詳細がわかりません。 (実際に現象を発生させようとしましたが、発生しません。) 追加するテーブル自体に主キーは設定していません。 データの書き込みは15秒に2レコード位なのですが、Update文の直後のinsert文がまれに失敗します。 とりあえず、トランザクション処理で回避していますが、PostgreSQLの設定値などの変更により、回避出来るのでしょうか。 また、この様な事はよくあることなのでしょうか。 説明が分かりづらく申し訳ありませんが、 宜しくお願いします。

  • 同じデータをinsertしないようにするには?

    1222 1222 1223 1234 1234 のような カラムに重複するような要素を含む、整理番号が入っていています。 このカラムに、番号が一つでも一致すれば、インサートしない、 つまり、1200という数字をインサートしようとしたとき そのカラムのすでにどこかしらに1200という数字が入っていれば インサートしないという風にしたいのです。 SELECTでいったん呼び出して、 if($〇〇が一件もなければ・・・){ $sql = "インサート"; } という方法を今までとっていたのですが、 もっと良い方法があるのではないかと色々調べたところ INSERT IGNOREというものがあることを知りました。 どうやらこれは、主キー、ユニークキーに限られたもので 今回のような重複する要素を含むカラムには使えない感じでした。 今回のような重複する要素を含むカラムに対して インサートの条件制御を行うことをINSERT文上で行うことは可能なのでしょうか? 可能であるとすれば、どのような記述でそれを実現することができるのでしょうか?

    • ベストアンサー
    • MySQL