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
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
@ jpmc26 Sie können hier auf etwas sein. Ich habe meine Frage mit einer Kurzversion meines SP aktualisiert. –