- ベストアンサー
T-SQLで10万件程度のInsert処理を記述したい。
T-SQLで10万件程度のInsert処理を記述したい。 カーソルを利用したループ処理の中で、 Insert失敗時(エラー時)のみ、そのデータだけスキップし、 次のデータ登録処理に進みたい場合、 どのように記述すればよいのでしょうか。
- みんなの回答 (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
その他の回答 (3)
- taka451213
- ベストアンサー率47% (436/922)
こんにちは。 えーと・・・、今どんな感じなんですかね? >カーソルを利用したループ処理の中で、 WHILE使ってない??? @@ERRORをキャッチしちゃってる? >Insert失敗時(エラー時)のみ、そのデータだけスキップし、 エラーを無視して続行・・・、でいいんですよね? 差し支えのない範囲で現在のソースを補足できませんか?
お礼
taka451213さん、なんとか解決できそうです。 何度もご教授いただきましてありがとうございました。
- taka451213
- ベストアンサー率47% (436/922)
こんにちは。 それでいいです。
補足
すみません。 私の知識不足だと思うのですが、CATCHブロックにCONTINUEは記述できないようです。 以下のエラーが出ます。 ”WHILE ステートメントのスコープ外では CONTINUE ステートメントを使用できません。”
- taka451213
- ベストアンサー率47% (436/922)
こんばんは。 エラーハンドリングして、CONTINUEでいいかと思います。
補足
早速のご回答ありがとうございます。 TRY CATCHでエラーハンドリングして、CATCH部にCONTINUEを記述するのでしょうか。 それでCURSORの次のデータから処理が始まるという認識でよろしいでしょうか。
お礼
例を示していただきましてとても分かりやすかったです。 助かりました。ありがとうございました。