SQLServer カーソル データがおかしい?? 普通にSELECT時と違う??

カーソルを回してINSERTとかしたら、なぜか件数が少ない?!
例えば・・・

DECLARE カーソル1 CURSOR FOR
SELECT 注文番号,品物番号 FROM テーブル1
WHERE 注文番号 NOT IN (SELECT 注文番号 FROM テーブル2)
OPEN カーソル1
FETCH NEXT FROM カーソル1 INTO @col1,@col2
WHILE (@@FETCH_STATUS=0)
BEGIN
INSERT INTO テーブル2(注文番号,品物番号) VALUES(@col1,@col2)
FETCH NEXT FROM カーソル1 INTO @col1,@col2
END
CLOSE カーソル1
DEALLOCATE カーソル1

あまり上手な例ではありませんが、注文番号が存在しないレコードをテーブル2へ入れようとしています。

これうまくいきません。

やってみると分かりますが、注文番号1つにつき、1レコードしか追加されません。詳しく調べていませんが、どうやら、FETCH NEXT した際に、カーソルのSELECTが再評価されているようです。
「注文番号 NOT IN」なんてやっているので、1レコード追加した段階で再評価されると条件にヒットしなくなる。

一時テーブルに入れてから、それをカーソルで回すとうまくいきます。

ちなみに、カーソルのSELECT文が複雑な場合は、一時テーブルに一旦保存してから、それをカーソルで回すほうが数百倍、いや数万倍?、いやいや数百万倍?、とにかくそのほうが速いです。

教訓・・・カーソルは単純なSELECT文で。