值-9对于SQL Server中的fetch_状态意味着什么?

值-9对于SQL Server中的fetch_状态意味着什么?,sql,sql-server,Sql,Sql Server,我试图获取嵌套循环中每个游标的fetch_状态。我无法在此处使用@@FETCH\u状态,因为另一个循环中有嵌套的循环 我的第一种方法是使用[sys.dm_exec_cursors][1]通过名称确定每个游标的状态。然后,如果fetch_状态不等于0,我将中断循环 根据,应返回以下值之一0,-1,-2 但是,在我的例子中,fetch_状态返回-9。9是什么意思 下面是我如何根据名称获取光标的状态 SET @fetchStatus = (SELECT TOP 1 [fetch_status] FR

我试图获取嵌套循环中每个游标的fetch_状态。我无法在此处使用@@FETCH\u状态,因为另一个循环中有嵌套的循环

我的第一种方法是使用[sys.dm_exec_cursors][1]通过名称确定每个游标的状态。然后,如果fetch_状态不等于0,我将中断循环

根据,应返回以下值之一0,-1,-2

但是,在我的例子中,fetch_状态返回-9。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
根据,fetch\u status列存储最后返回的@@fetch\u状态。这意味着在对游标执行第一次获取之前,fetch_状态是未定义的,并且似乎使用-9对其进行编码。下面的示例确实向SQL Server 2012显示,在调用第一次提取之前,值为-9:

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'

不知道,但假设这是最后一个返回的@@FETCH\u状态值。现在,我想知道-9是否表示从未访问过@@FETCH\u状态,或者是否从未进行过提取。这就是说,一个完全可复制的例子可能会对解决这个问题大有帮助。@jpmc26您可能在这里找到了一些东西。我用我的SP的简短版本更新了我的问题。事实上,这是正确的答案。我希望文件能说明这一点,它似乎只是解释了0,-1,-2