• ベストアンサー

T-SQLで10万件程度のInsert処理を記述したい。

T-SQLで10万件程度のInsert処理を記述したい。 カーソルを利用したループ処理の中で、 Insert失敗時(エラー時)のみ、そのデータだけスキップし、 次のデータ登録処理に進みたい場合、 どのように記述すればよいのでしょうか。

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

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

CATCHブロックの中は空でいいですよ(CONTINUEはOracleでは?) 以下ご参考までに。 件数のことを考えると、エラーになる理由が分かっているならば、本当はカーソルを使わずにエラーにならないものだけをINSERTするような処理を書いた方がよいですけどね。 DECLARE @TBL TABLE (ID int PRIMARY KEY,VAL char(1)) DECLARE @ID int,@VAL char(1) DECLARE C CURSOR FAST_FORWARD LOCAL FOR SELECT 1 ID,'A' VAL UNION ALL SELECT 2 ID,'B' VAL UNION ALL SELECT 3 ID,'C' VAL UNION ALL SELECT 3 ID,'D' VAL UNION ALL SELECT 4 ID,'E' VAL UNION ALL SELECT 5 ID,'F' VAL OPEN C FETCH NEXT FROM C INTO @ID,@VAL WHILE (@@FETCH_STATUS=0) BEGIN  BEGIN TRY   INSERT INTO @TBL VALUES (@ID,@VAL)  END TRY  BEGIN CATCH  END CATCH  FETCH NEXT FROM C INTO @ID,@VAL END CLOSE C DEALLOCATE C SELECT * FROM @TBL ID VAL -------- 1 A 2 B 3 C 4 E 5 F

sys_ad
質問者

お礼

例を示していただきましてとても分かりやすかったです。 助かりました。ありがとうございました。

その他の回答 (3)

回答No.3

こんにちは。 えーと・・・、今どんな感じなんですかね? >カーソルを利用したループ処理の中で、 WHILE使ってない??? @@ERRORをキャッチしちゃってる? >Insert失敗時(エラー時)のみ、そのデータだけスキップし、 エラーを無視して続行・・・、でいいんですよね? 差し支えのない範囲で現在のソースを補足できませんか?

sys_ad
質問者

お礼

taka451213さん、なんとか解決できそうです。 何度もご教授いただきましてありがとうございました。

回答No.2

こんにちは。 それでいいです。

sys_ad
質問者

補足

すみません。 私の知識不足だと思うのですが、CATCHブロックにCONTINUEは記述できないようです。 以下のエラーが出ます。 ”WHILE ステートメントのスコープ外では CONTINUE ステートメントを使用できません。”

回答No.1

こんばんは。 エラーハンドリングして、CONTINUEでいいかと思います。

sys_ad
質問者

補足

早速のご回答ありがとうございます。 TRY CATCHでエラーハンドリングして、CATCH部にCONTINUEを記述するのでしょうか。 それでCURSORの次のデータから処理が始まるという認識でよろしいでしょうか。

関連するQ&A