@@FETCH_STATUS <>-1 AND @@FETCH_STATUS <>-2 是什么意思?

What does @@FETCH_STATUS <>-1 AND @@FETCH_STATUS <>-2 mean?

我遇到一道试题,里面有如下代码:

ALTER FUNCTION fncF2 (@HWStreamIndex int = 0)
RETURNS nvarchar(max)
AS
BEGIN

    DECLARE @OnSiteGroups AS nvarchar(150)
    DECLARE @OnSiteGroupDetails AS nvarchar(1000)
    DECLARE @HWOnSiteGroupIndex AS int
    DECLARE @OnSiteGroupsTotal AS nvarchar(max)
    SET @OnSiteGroupsTotal = ''

    DECLARE cursor1 CURSOR
    READ_ONLY FOR
            SELECT
                HWOnSiteGroupName + '-' AS OnSiteGroups,
                HWOnSiteGroupIndex
            FROM 
                HW_STREAM_ONSITE_GROUP
            WHERE 
                HWStreamIndex = @HWStreamIndex

    OPEN cursor1

    FETCH NEXT FROM cursor1 INTO @OnSiteGroups, @HWOnSiteGroupIndex
    WHILE (@@fetch_status <> -1)
    BEGIN
        IF (@@fetch_status <> -2)
        BEGIN
            BEGIN
                SET @OnSiteGroupsTotal = @OnSiteGroupsTotal + @OnSiteGroups + ' -- '

                DECLARE cursor2 CURSOR
                READ_ONLY FOR
                        SELECT
                            ISNULL(HW_MANAGE_METH_CODES.HWMMCode, '') + '_' +
                            CONVERT(nvarchar(20), CONVERT(decimal(12, 2), 
                            ISNULL(HW_STREAM_ONSITE_GROUP_DETAILS.PercentProcessed, 0.0) * 100)) + '%' AS OnSiteGroups
                        FROM 
                            HW_STREAM_ONSITE_GROUP_DETAILS
                            JOIN HW_STREAM_ONSITE_GROUP
                                ON HW_STREAM_ONSITE_GROUP_DETAILS.HWOnSiteGroupIndex = HW_STREAM_ONSITE_GROUP_DETAILS.HWOnSiteGroupIndex
                            LEFT JOIN HW_MANAGE_METH_CODES
                                ON HW_STREAM_ONSITE_GROUP_DETAILS.HWMMCodeIndex = HW_MANAGE_METH_CODES.HWMMCodeIndex
                        WHERE 
                            HW_STREAM_ONSITE_GROUP_DETAILS.HWOnSiteGroupIndex = @HWOnSiteGroupIndex

                OPEN cursor2

                FETCH NEXT FROM cursor2 INTO @OnSiteGroupDetails
                WHILE (@@fetch_status <> -1)
                BEGIN
                    IF (@@fetch_status <> -2)
                    BEGIN
                        BEGIN
                            SET @OnSiteGroupsTotal = @OnSiteGroupsTotal + @OnSiteGroupDetails + ', '
                        END
                    END
                    FETCH NEXT FROM cursor2 INTO @OnSiteGroupDetails
                END

                CLOSE cursor2
                DEALLOCATE cursor2

            END
        END
        FETCH NEXT FROM cursor1 INTO @OnSiteGroups, @HWOnSiteGroupIndex
    END

    CLOSE cursor1
    DEALLOCATE cursor1

    RETURN @OnSiteGroupsTotal
END

通常我在使用游标时使用@@FETCH_STATUS = 0。我试图了解这段代码的工作原理,以及 @@FETCH_STATUS <> -1@@FETCH_STATUS <> -2 如何影响整体执行,但我无法理解这段代码。

谁能解释一下语句 @@FETCH_STATUS <> -1@@FETCH_STATUS <> -2 的目的是什么以及这个函数的执行步骤是什么?

Microsoft Documentation 中所述,有 4 个可能的 @@FETCH_STATUS 值,每个代表不同的状态消息:

  • 0 - FETCH 语句成功。
  • -1 - FETCH 语句失败或该行超出结果集。
  • -2 - 提取的行丢失。
  • -9 - 光标未执行提取操作。

WHILE (@@fetch_status <> -1) 告诉循环 运行 只要 最后一个游标 FETCH 语句成功并且该行在结果集中。

IF (@@fetch_status <> -2) 正在检查以确保在继续该过程之前该行存在。