游标不循环所有记录

Cursor Not looping all the Records

我创建了一个带有游标的存储过程来循环遍历 table,其中包含以下记录:

MTR         EGA
----------------
NULL        110      
NULL        111       
NULL        121       
NULL        130       
NULL        140       
NULL        150       
1303330015  130  

但是游标只打印第一条记录(NULL, 110),并没有遍历所有记录。

ALTER PROCEDURE [dbo].[RECEV_Manual]
    DECLARE @FROMDATE DATETIME
    DECLARE @TODATE DATETIME
    DECLARE @COMPANY INT
    DECLARE @DIVISION VARCHAR(100)

    DECLARE @DOCTYPE VARCHAR(10) = '5';
    DECLARE @CONO INT = 1000;
    DECLARE @DocType1 VARCHAR(20) = 'Y4';

    SET @FROMDATE = CONVERT(VARCHAR, GETDATE() - 30, 111)
    SET @TODATE = CONVERT(VARCHAR, GETDATE(), 111)

    SET @COMPANY = 1000
    SET @DIVISION = '110'

    CREATE TABLE #Temp1 
    (
        ......
    )

    CREATE TABLE #Temp2 
    (
        ......
    )

    INSERT INTO #Temp1....

    INSERT INTO #Temp2....

    SELECT DISTINCT MTR, EGA 
    INTO #MTRS
    FROM #Temp2

    /* Table #MTRS Values....

    MTR         EGA
    ------------------
    NULL        110       
    NULL        111       
    NULL        121       
    NULL        130       
    NULL        140       
    NULL        150       
    1303330015  130  
     .......*/  

    DECLARE @docNo VARCHAR(50);
    DECLARE @partner VARCHAR(50);

    DECLARE @docCount INT = (SELECT COUNT(DISTINCT MTR)
                             FROM #Temp1); --This  prints 1

    DECLARE @lineNo INT = 0;

    DECLARE lineCursor CURSOR FOR
        SELECT DISTINCT MTR, EGA 
        FROM #MTRS

    OPEN lineCursor;

    FETCH NEXT FROM lineCursor INTO @docNo, @partner

    WHILE @@FETCH_STATUS = 0
    BEGIN
        IF @lineNo < @docCount
        BEGIN
            PRINT @lineNo -- prints 0
            PRINT @docCount -- prints 1

            SET @lineNo = @lineNo + 1;

            PRINT @docNo -- prints empty
            PRINT @partner -- prints 110

            DECLARE @DIVI VARCHAR(50);
            DECLARE @VONO VARCHAR(50);

            SET @DIVI = (SELECT TOP 1 DIVI
                         FROM #Data);
            SET @VONO = (SELECT TOP 1 VONO
                         FROM #Data);

            DECLARE @count INT = (SELECT COUNT(*)
                                  FROM [data]
                                  WHERE VONO = @VONO
                                    AND MTR = @docNo)

            PRINT @count --prints 0

            IF @count = 0
            BEGIN
                PRINT @docNo --prints empty
                PRINT @partner -- prints 110

                --Do stuff--
            END
        END

        FETCH NEXT FROM lineCursor INTO @docNo, @partner
    END

    CLOSE lineCursor;
    DEALLOCATE lineCursor;
END

光标只打印一次,因为这只为真一次:

IF @lineNo < @docCount

之后,你这样做:

SET @lineNo = @lineNo + 1;

并且您永远不会将 @lineNo 设置回零,因此当光标循环返回时,IF 条件不再为真,因此其块中的 none 内容已完成。