2016-03-28 3 views
1

Ich versuche, den fetch_status für jeden Cursor in einer verschachtelten Schleife zu erhalten. Ich kann @@FETCH_STATUS hier wegen der verschachtelten Schleifen (Schleife innerhalb einer anderen Schleife) nicht verwendenWas bedeutet der Wert -9 für fetch_status in SQL Server?

Meine erste Annäherung ist, [sys.dm_exec_cursors][1] zu verwenden, um den Status jedes Cursors durch einen Namen zu bestimmen. Wenn der fetch_status nicht gleich 0 ist, würde ich die Schleife unterbrechen.

Nach den doc the fetch_status soll eine der folgenden Werte zurückgeben 0, -1, -2

jedoch der fetch_status in meinem Fall kehrt . Was bedeutet -9?

Hier ist, wie ich versuche, den Status des Cursors zu erhalten, basierend auf den Namen

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

Hier ist eine kurze Version meiner gespeicherten Prozedur

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

Keine Ahnung, aber [die Dokumentation] (https://msdn.microsoft.com/en- us/library/ms190346.aspx) sagen, es ist der "letzte zurückgegebene' @@ FETCH_STATUS' Wert ". Off-Hand, ich frage mich, ob -9 bedeutet, dass '@@ FETCH_STATUS' nie zugegriffen wurde oder wenn ein Abruf nie aufgetreten ist. Das heißt, ein vollständig reproduzierbares Beispiel würde wahrscheinlich einen langen Weg gehen, um es herauszufinden. – jpmc26

+0

@ jpmc26 Sie können hier auf etwas sein. Ich habe meine Frage mit einer Kurzversion meines SP aktualisiert. –

Antwort

2

Gemäß den documentation, die fetch_status Spalte speichert die zuletzt zurückgegebene @@FETCH_STATUS. Dies bedeutet, dass fetch_statusundefined ist, bevor die erste FETCH gegen den Cursor ausgeführt wird und es scheint, dass -9 verwendet wird, um dies zu kodieren. Das folgende Beispiel macht in der Tat zeigen (SQL Server 2012), dass der Wert -9 vor den ersten FETCH genannt wird:

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

Tatsächlich war das die richtige Antwort. Ich wünsche, dass die Docs das zeigen und es scheint nur 0, -1, -2 zu erklären –

Verwandte Themen