【问题标题】:What does the value -9 means for fetch_status in SQL Server?值 -9 对 SQL Server 中的 fetch_status 意味着什么?
【发布时间】:2016-03-29 06:48:51
【问题描述】:

我正在尝试获取嵌套循环中每个游标的 fetch_status。由于嵌套循环(在另一个循环中循环),我无法在此处使用@@FETCH_STATUS

我的第一种方法是使用[sys.dm_exec_cursors][1] 通过名称来确定每个游标的状态。然后如果 fetch_status 不等于 0 我会打破循环。

根据doc the fetch_status应该返回以下值之一:0、-1、-2

但是,在我的例子中,fetch_status 返回-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

【问题讨论】:

  • 不知道,但the docs 说这是“最后返回的@@FETCH_STATUS 值”。顺便说一句,我想知道 -9 是否意味着从未访问过 @@FETCH_STATUS 或者从未发生过提取。也就是说,一个完全可重复的示例可能会在很长的道路上解决它。
  • @jpmc26 你可能在这里有所收获。我用简短版本的 SP 更新了我的问题。

标签: sql sql-server


【解决方案1】:

根据documentation,fetch_status 列存储最后返回的@@FETCH_STATUS。这意味着 fetch_status 是 undefined 在第一个 FETCH 对光标执行之前,似乎 -9 用于对此进行编码。下面的示例确实显示(SQL Server 2012)在调用第一个 FETCH 之前该值为 -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'

【讨论】:

  • 确实是正确答案。我希望文档能说明这一点,而且它似乎只能解释 0、-1、-2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 2020-10-12
  • 2011-06-11
  • 2010-10-02
  • 2013-01-16
  • 1970-01-01
相关资源
最近更新 更多