2011-09-16 6 views
3

SQL Server 2000データベースがあります。次のカーソルを実行して個々のレコードのトリガーを起動する必要があります(トリガーは一度に1つのレコードでのみ動作します)。SQL Server 2000カーソルで問題が発生しましたNEXT

DECLARE @REC as bigint 

DECLARE coil1_cursor CURSOR FOR 
SELECT Rec# FROM coil1 WHERE Timestamp BETWEEN '2011-05-10 06:00:00' AND '2011-05-10 07:00:00' 

OPEN coil1_cursor 
FETCH NEXT FROM coil1_cursor INTO @REC 

WHILE (@@FETCH_STATUS=0) 
BEGIN 
    Print @Rec 
    UPDATE coil1 SET ShiftLength=Null WHERE Rec#[email protected] 

    FETCH NEXT FROM coil1_cursor INTO @REC 
END 
CLOSE coil1_cursor 
DEALLOCATE coil1_cursor 

私がUPDATE行をコメントアウトすると、Rec#フィールドからシーケンシャル番号が期待どおりに取得されます。 UPDATE行のコメントを外すと、バッチは無限ループに入ります。バッチを停止すると、取得した最初のレコードの更新のみが表示されます。これはFETCH NEXTのようなものです。なぜどんなアイデア?

+5

一度に1つのレコードでしか動作しないトリガーを書き換える必要があります。 –

+0

"FROM inserted"のすべてのレコードで操作できるようにトリガーを修正できますか?もしそうなら、単にUPDATE coil1を使用してください。SET ShiftLength = Null WHERE [Timestamp] BETWEEN '2011-05-10 06:00:00' AND '2011-05-10 07:00:00'。私はあなたが手元の問題に間違った解決策を実装しようとしていると思います。 – HardCode

+1

トリガーで一度カーソルを削除したところ、40,000レコードしか挿入できなかったのは45分以上から1分未満でした。トリガ内でカーソルを使用することは非常に貧しい方法です。 – HLGEM

答えて

5

デフォルトのカーソルオプション(ダイナミックを含む)を使用しています。

DECLARE coil1_cursor CURSOR LOCAL STATIC FORWARD_ONLY READ_ONLY 
FOR ... 

をしかし、本当の修正のために、ジョーは絶対的に正しいです - これは全くのカーソルではありません:あなたの目的のためにはるかに効率的なカーソルを使用してみてください。 1つの更新ステートメントで同じことを達成できます。いいえ、カーソル、ない無限ループ、待ち時間なし:それは、日付や時間とは何の関係もないデータ型を表すため

UPDATE coil1 
    SET ShiftLength = NULL 
    WHERE [Timestamp] BETWEEN '2011-05-10 06:00:00' AND '2011-05-10 07:00:00' 

(余談としては、[Timestamp]は恐ろしい列名ではありませんRec#は、いずれかの素晴らしいではありません。

+0

+1は 'LOCAL'を使用し、更新ステートメントを提供しています。 –

+0

私はすべてのあなたのコメントに同意しますが、よくあることですが、私たちは私たちに配布されたカードで作業する必要があります。 LOCAL STATIC ...オプションは問題を解決しました。ありがとう! – ccampj

+0

ああ、ちょうどカーソルがトリガーの内側にないのを見ています。誤解をおかけして申し訳ありません。なぜ、外部コードがトリガーが正しく行っていないジャンクをクリーンアップしないのですか?あなたは、トリガーが1つの行に対して何をしているのかを、すべての行に対して行うべきであるということについて詳細に調べることができますか? –

2

カーソルで参照されるテーブルを更新するため、カーソルをSTATICと宣言する必要があります。

DECLARE coil1_cursor CURSOR STATIC FOR 
SELECT Rec# FROM coil1 WHERE Timestamp BETWEEN '2011-05-10 06:00:00' AND '2011-05-10 07:00:00' 
+0

補足として、 'INSENSITIVE'は' STATIC'の同義語です –

+0

@Filipしかし、入力するのはずっと多くの作業です!また、タイプミスが発生しやすくなります。 :-) –

+0

@Aaronあなたはとても敏感ではありません。 –

関連する問題