• ベストアンサー

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

  • インサート処理のスピード

    n件のデータを (1)SELECT INSERTで処理するのと、 (2)SELECT文をカーソルループにして1件ずつINSERTするのでは 処理時間は結構違うのでしょうか? 手元に実行環境がないためご存知の方がいらっしゃったらご教授下さい。 (SQLSERVERかORACLEかなどは問いませんので)

  • T-SQL 一件のみのデータ取得について

    T-SQL(SQL Server2000)で対象データを一件のみ取得する場合、どのようにすれば良いでしょうか? 処理的に無理でしょうか? PL/SQLの"ROWNUMBER = 1"のような条件は使うことが出来ないのでしょうか? 説明が苦手で分かりづらいかも知れませんが、宜しくお願いします。

  • SQL INSERTの使い方を教えてください

    vb2008でアクセスへデータを書き込む部分のコードを書こうとしているのですが、SQLのINSERT構文を使って連続した10レコードをテーブルへINSERTしたいのですが1つわからないところがあります。例えば、あるフィールドで、1番目のレコードだけアイテムが入り、残りは書き込む必要がない場合、Do~Loopなど使用しINSERT構文にて書き込み処理する場合、どのように条件わけするとすっきり書けるでしょうか・・・?いい感じのロジックがあればご教授願います。

  • T-SQLでDECODEの様な処理

    質問させて頂きます。 T-SQLでPL/SQLのDECODE()の様な処理を行いたいのですが、T-SQLでは同じ様な処理ができる関数はあるのでしょうか? やりたい処理としては、下記のINSERT文でAテーブル.項目Bに設定する値をCテーブル.項目Bの値が"1"ならBテーブル.項目Bを設定し、 それ以外ならCテーブルの.項目Bを設定するという内容です。 ※INSERT文はT-SQLで行いたい処理をPL/SQLで組んだものです。 INSERT Aテーブル ( 項目A, 項目B ) SELECT Bテーブル.項目A, DECODE(Cテーブル.項目B,'1',Bテーブル.項目B,Cテーブル.項目B) FROM Bテーブル, Cテーブル WHERE 割愛 使用しているバージョンはsqlserver2000を使用しています。 DECODE自体は使用できないことは確認済みです。実現可能か不可能や実現可能な場合はサンプルなどで教えて頂きたいです。 皆様のご助力をお願い致します。

  • PL/SQLのエラー処理について

    PL/SQLを勉強し始めたのですが、テーブルを作成してから、データを流し込むという処理をしたいのですが、テーブルの作成に失敗しらたら、処理を終了させるという処理はできないのでしょうか? それとも、考え方が違うのでしょうか?アドバイスお願いします。 次のようにPL/SQLを作成しています。 例) declare curHandle1 INTEGER; begin curHandle1 := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(curHandle1, 'create table xxx as select * from xxx where ID=-1', DBMS_SQL.V7); DBMS_SQL.CLOSE_CURSOR(curHandle1); exception when OTHERS then エラーになったら、処理終了したい(次のブロックにいきたくない) end; declare begin      insert into xxx NOLOGGING values (1,'test'); end; よろしくお願いします。

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

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

  • SQL*LoaderとInsertの違いについて

    大量データを扱う場合、下記2通りの方法がある事を知りました。どちらが大量データの書き込み処理が早いのでしょうか? (1)SQL*Loaderのダイレクト・パス・ロード (2)insert /*+ append */ によるダイレクト・パス・インサート また、通常のINSERTと比べてどれ位時間短縮されるものか事例等ありましたら目安として教えて下さい。

  • PL/SQLによるCREATE TABLE後のINSERTができない

    いつもお世話になっております。 次で、PL/SQLで自動的に表tbを作成し、日時を挿入することを試みています。 BEGIN EXECUTE IMMEDIATE 'CREATE TABLE tb (t TIMESTAMP)'; INSERT INTO tb VALUES(SYSTIMESTAMP); END; / 実行すると、tbが作られていない旨のエラーになってしまいます。 INSERT部分がなければ、表tbは作成できます。 表を作成し、データを挿入するにはどのようにすればよろしいでしょうか。 何卒よろしくお願いいたします。

  • SQL インスタンスの¥をクエリーに記述したい

    リンクサーバからデータを取得したいのですが、インスタンスの¥の処理がわかりません。 すみませんが教えてください。 execute ('INSERT INTO testPC1¥SQL2005.test FROM SELECT * FROM testPC2¥SQL2005.testJP')

  • insert処理でDATE型を追加したい

    環境はxp、apache2、php5、Postgresql8.2です。 1台のPCをサーバ&クライアントにしています。 ただ今PHPとPostgresqlの勉強をしています。 いつも質問に答えてくれてありがとうございます。 以下のようなテーブルに insert処理でデータを追加したいと思っています。 --------------------------- CREATE TABLE m_lecturehistory ( lecturecode text, lecturedate date, ・ ・ ・ --------------------------- $sql = "insert into m_lecturehistory (lecturecode, lecturedate ) values ('{$line[0]}','2008/1/1');"; このようにしてinsert処理をすれば正常に追加できます。 ただ、以下のようにして 変数からDATE型に追加しようとするとエラーになります。 --------------------------- $line[1] = "2008/1/1"; $sql = "insert into m_lecturehistory (lecturecode, lecturedate ) values ('{$line[0]}',"{$line[1]}");"; 対処方法をご存じでしたら、 ご教示して頂けたら幸いです。