2011-06-23 10 views
1

私は実際には2つのカーソルを持つ悪いデザインを使用しています(私はそれを認識していますが、タスクは単純なので、最適化を気にしませんでした)。ここであいまいさは避けていますか?

DECLARE cursor1 CURSOR FAST_FORWARD FOR 
SELECT DISTINCT name FROM #NameMeta; 

OPEN cursor1; 

FETCH NEXT FROM cursor1 INTO @name 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    DECLARE cursor2 CURSOR FAST_FORWARD FOR 
    SELECT DISTINCT place FROM #PlaceMeta; 

    OPEN cursor2; 

    FETCH NEXT FROM cursor2 INTO @place 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 

    ... 
    ... 
... 
... 

私は実際にExecuteボタンをクリックするまでは、私はこのクエリが間違っていることをかなり確信していたし、それがエラーで救済すること:私はこのようなクエリを使用しています。私が見るところでは、2つの@@FETCH_STATUSが使用されています。したがって、新しいカーソルを開く前に最初の@@FETCH_STATUSの状態をスタックに保存しない限り、このクエリは機能しません。

このクエリがどのくらい正確に機能するか教えていただけますか?私の主な質問は、複数の比較チェックを@@FETCH_STATUSとすることです。手動で手作業で手作業で検証しましたが、これがコーナーケースで失敗するか、クエリが正当なものであり、SQL Serverが何か他のことをしているかどうかはわかりません。

答えて

3

@@FETCH_STATUSは、常に最新のFETCH操作の結果を返します。

1

クエリは正常に動作します。 @@ FETCH_STATUSは、常に最後のfetch文の状態を返します。あなたの@@ FETCH_STATUSはステータスがチェックされるべきFETCH文の直後にあるので、あなたは大丈夫でしょう。

関連する問題