2012-08-09 54 views
0

我想使用遊標從存儲過程中檢索結果。請看下面的存儲過程。如何使用光標填充存儲過程

CREATE PROCEDURE Test 
@ID INT 
AS 
BEGIN 

     DECLARE @Name VARCHAR(400); 
     DECLARE ACursor CURSOR FOR EXEC AStoredProcedure @ID 

    OPEN ACursor; 
    FETCH NEXT FROM ACursor INTO @Name; 

     WHILE @@FETCH_STATUS = 0 
     BEGIN 
      PRINT @NAME 
     END 
    CLOSE ACursor; 
    DEALLOCATE ACursor; 

END 

我有這個錯誤。但我想這樣使用。我怎樣才能做到這一點?

PS。我無法對存儲過程執行INSERT EXEC語句。因爲存儲過程已經使用此語句,我不想​​對此存儲過程進行任何更改。

+2

**你得到了什麼**錯誤?請 - 我們不是mindreaders,也不能看到你的屏幕。你需要**至少提供**必要的位,以便我們能夠幫助你! – 2012-08-09 04:54:30

+0

我可以建議你改變你的方法,對於數據量在1,000,000範圍內的表......這種方法將是危險的 – 2012-08-09 05:07:52

回答

0

你需要指定一個數據類型@ID 可能@ID INT

+0

對於錯誤的代碼我很遺憾。我改變了它。請檢查一下。 – zanhtet 2012-08-09 03:55:37

+0

像這樣的事情......用存儲過程的結果創建臨時表,然後從臨時表創建光標。 http://stackoverflow.com/questions/1296753/navigating-the-results-of-a-stored-procedure-via-a-cursor-using-t-sql – puddinman13 2012-08-09 04:09:57

0

你忘了取環內的下一行:

CREATE PROCEDURE Test 
@ID INT 
AS 
BEGIN 

     DECLARE @Name VARCHAR(400); 
     DECLARE ACursor CURSOR FOR EXEC AStoredProcedure @ID 

    OPEN ACursor; 
    FETCH NEXT FROM ACursor INTO @Name; 

     WHILE @@FETCH_STATUS = 0 
     BEGIN 
      PRINT @NAME 
      FETCH NEXT FROM ACursor INTO @Name; 
     END 
    CLOSE ACursor; 
    DEALLOCATE ACursor; 

END 

這應該被改寫爲:

OPEN ACursor; 
    WHILE 1 = 1 
    BEGIN 
     FETCH NEXT FROM ACursor INTO @Name; 

     IF @@FETCH_STATUS <> 0 
     BEGIN 
      BREAK 
     END 
     PRINT @NAME 
    END 
    CLOSE ACursor; 
    DEALLOCATE ACursor; 

這樣你的代碼中只有一個fetch。現在忘記它並不容易,也不必爲添加到遊標查詢的列分別追加每次獲取。

遊標是邪惡的,但有時是必要的。要加速使用fast_forwardstatic關鍵字,並使用local,以便代碼中的錯誤不會將打開的遊標留在後面。