2013-06-04 117 views
1
DECLARE AssigChart CURSOR FOR SELECT vad_id_no, drv_id_no, vad_st_dt, vad_st_tm, vad_fn_dt, vad_fn_tm FROM lu02vad WHERE lTachoSmartCardID = @tachoSmartCardID 

    OPEN AssigChart FETCH NEXT FROM AssigChart INTO @ChartID, @drvid, @dStartTime, @lStartTime, @dEndTime, @lEndTime 
    WHILE (@@FETCH_STATUS <> -1) 
    BEGIN 


<------------------some processing ---------------------->>>>>>>> 


FETCH NEXT FROM AssigChart 
     INTO @ChartID, @drvid, @dStartTime, @lStartTime, @dEndTime, @lEndTime 
    END 
    CLOSE AssigChart 
    DEALLOCATE AssigChart 
+1

是否'一些processing'包含任何其他光標代碼?我見過很多人都搞砸了嵌套遊標。此外,'@@ FETCH_STATUS'的通常使用是'WHILE @@ FETCH_STATUS = 0',它檢查是否成功,而不是*可能的失敗代碼。 –

回答

1

@@ FETCH_STATUS返回下面的值....

0 The FETCH statement was successful. 
-1 The FETCH statement failed or the row was beyond the result set. 
-2 The row fetched is missing. 

所以對於unsuccessfull它可以retur -1和-2人,soeither您可以檢查它這樣的.. ..

while @@FETCH_STATUS=0 

while @@FETCH_STATUS<>-1 and @@FETCH_STATUS<>-2 
+0

不僅'@@ FETCH_STATUS'檢查不正確,而且您通常會在進入循環時使用FETCH _before_進行變種。 –

+0

@ElectricLlama我覺得OP entring循環之前獲取它......看到it..after其中op打開遊標...... –

+0

我們有一個處理單元內的另一個光標,是重置@@ FETCH_STATUS每次爲0? – user2450518

1

嘗試這一個 -

DECLARE AssigChart CURSOR READ_ONLY LOCAL FAST_FORWARD FOR 
    SELECT vad_id_no, drv_id_no, vad_st_dt, vad_st_tm, vad_fn_dt, vad_fn_tm 
    FROM lu02vad 
    WHERE lTachoSmartCardID = @tachoSmartCardID 

OPEN AssigChart 

FETCH NEXT FROM AssigChart INTO   
      @ChartID 
     , @drvid 
     , @dStartTime 
     , @lStartTime 
     , @dEndTime 
     , @lEndTime 

WHILE @@FETCH_STATUS = 0 BEGIN 

    -- your statements 

    FETCH NEXT FROM AssigChart INTO 
      @ChartID 
     , @drvid 
     , @dStartTime 
     , @lStartTime 
     , @dEndTime 
     , @lEndTime 

END 

CLOSE AssigChart 
DEALLOCATE AssigChart 
+0

謝謝這麼多...... – user2450518

+0

不客氣@ user2450518。 – Devart

+1

如果此解決方案完全適合您,請批准它。 FOR SELECT DISTINCT vad_id_no,drv_id_no,vad_st_dt,vad_st_tm,vad_fn_dt,vad_fn_tm FROM lu02vad \t – Devart