2011-06-23 35 views
1

我實際上是使用兩個遊標進行糟糕的設計(我意識到這一點,但後來任務很簡單,所以我沒有爲優化而煩惱)。我使用的是這樣的查詢:這裏如何避免歧義?

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按鈕,我敢肯定,這個查詢是錯誤的,它會解救一個錯誤。從我所看到的,有兩個@@FETCH_STATUS被使用。因此,除非在打開新光標之前將第一個@@FETCH_STATUS的狀態保存在堆棧的某個位置,否則此查詢不應起作用。

有人可以告訴我這個查詢究竟是如何工作的嗎?我的主要問題是關於與@@FETCH_STATUS進行多重比較檢查。我手動驗證了一些結果,但不確定這是否會因爲角落案例而失敗,或者查詢是否正確,SQL Server還在做其他事情。

回答

1

查詢,就這樣,會正常工作。 @@ FETCH_STATUS總是返回上次讀取語句的狀態。由於您的@@ FETCH_STATUS緊跟在其狀態將被檢查的FETCH語句之後,因此您會沒事的。