2016-03-28 36 views
1

我想在嵌套循環中獲取每個遊標的fetch_status。我無法在這裏使用@@FETCH_STATUS,因爲嵌套循環(在另一個循環內的循環)對於SQL Server中的fetch_status,值-9意味着什麼?

我的第一種方法是使用[sys.dm_exec_cursors][1]來確定每個遊標的名稱狀態。然後,如果fetch_status不等於0,我會打破循環。

按照doc the fetch_status應返回以下值:0,-1之一,-2

然而,在我的情況下FETCH_STATUS將返回。 -9是什麼意思?

這裏是我嘗試基於名稱

SET @fetchStatus = (SELECT TOP 1 [fetch_status] FROM sys.dm_exec_cursors (@@SPID | 0) WHERE name = 'pageCursor'); 

這裏得到光標的狀態是我的存儲過程

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[CloneSurvey] @sourceSurveyId INT, @newSurveyName VARCHAR(255) 

AS 
BEGIN 

    DECLARE @fetchStatus INT; 

    If CURSOR_STATUS('global','pageCursor') <> -3 
     DEALLOCATE pageCursor; 


    DECLARE pageCursor CURSOR FOR 
    SELECT 
    [id] 
    FROM [survey_pages] 
    WHERE survey_id = @sourceSurveyId; 

    DECLARE @lastPageId INT; 

    DECLARE @pageId INT; 

    SET NOCOUNT ON; 
    SET XACT_ABORT ON; 

    BEGIN TRY 

     BEGIN TRAN Survey; 

     OPEN pageCursor; 

     WHILE 1 = 1 
     BEGIN 

      SET @fetchStatus = (SELECT TOP 1 [fetch_status] FROM sys.dm_exec_cursors (@@SPID | 0) WHERE name = 'pageCursor'); 

      SELECT 'FETCH STAUS => ' + CONVERT(VARCHAR, @fetchStatus); 

      if @fetchStatus <> 0 AND @fetchStatus <> -9 
       BREAK; 

      FETCH NEXT FROM pageCursor 
      INTO 
       @pageId 


      INSERT INTO surveys(page_id) 
      SELECT @pageId; 

      @lastPageId = SCOPE_IDENTITY(); 

      EXEC [dbo].[CloneQuestion] @lastPageId 

     END; 

     CLOSE pageCursor; 
     DEALLOCATE pageCursor; 

     COMMIT TRAN Survey; 

    END TRY 
    BEGIN CATCH 
     SELECT 
     ERROR_NUMBER() AS ErrorNumber 
     ,ERROR_SEVERITY() AS ErrorSeverity 
     ,ERROR_STATE() AS ErrorState 
     ,ERROR_PROCEDURE() AS ErrorProcedure 
     ,ERROR_LINE() AS ErrorLine 
     ,ERROR_MESSAGE() AS ErrorMessage; 

     IF(@@TRANCOUNT > 0) 
      ROLLBACK TRAN Survey; 

    END CATCH; 


END 
+0

不知道,但是[該文檔(https://msdn.microsoft.com/en- us/library/ms190346.aspx)表示這是「最後返回的@@ FETCH_STATUS值」。副手,我想知道如果-9意味着「@@ FETCH_STATUS」從未被訪問或者從未發生過提取。也就是說,一個完全可重現的例子可能會用很長的一段時間來解決它。 – jpmc26

+0

@ jpmc26你可能會在這裏。我用一個簡短的SP版本更新了我的問題。 –

回答

2

由於每documentation的一個短版,fetch_status列存儲最後返回的@@FETCH_STATUS。這意味着在對光標執行第一個FETCH之前fetch_statusundefined,它似乎用-9來編碼。下面的例子確實做節目(SQL Server 2012中),該值是-9第一FETCH之前被稱爲:

DECLARE cur1 CURSOR LOCAL 
FOR 
    SELECT 1 

OPEN cur1 

--fetch_status = -9 
SELECT fetch_status 
FROM  sys.dm_exec_cursors(@@SPID) 
WHERE name = 'cur1' 

FETCH NEXT FROM cur1; 

--fetch_status=0 
SELECT fetch_status 
FROM  sys.dm_exec_cursors(@@SPID) 
WHERE name = 'cur1' 
+0

事實上,這是正確的答案。我希望文檔顯示,它似乎只解釋0,-1,-2 –

相關問題