Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 游标未循环所有记录_Sql_Sql Server_Loops_Stored Procedures_Cursor - Fatal编程技术网

Sql 游标未循环所有记录

Sql 游标未循环所有记录,sql,sql-server,loops,stored-procedures,cursor,Sql,Sql Server,Loops,Stored Procedures,Cursor,我创建了一个存储过程,其中有一个游标在一个表中循环,该表包含以下记录: MTR EGA ---------------- NULL 110 NULL 111 NULL 121 NULL 130 NULL 140 NULL 150 1303330015 130 但是光标只打印第一条记录NULL 110,它不会循

我创建了一个存储过程,其中有一个游标在一个表中循环,该表包含以下记录:

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

而且您从未将@lineNo设置回零,因此当光标循环回零时,IF条件不再为true,因此其块中的所有内容都不会完成。

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

IF @lineNo < @docCount

而且您从未将@lineNo设置回零,因此当光标返回时,IF条件不再为真,因此其块中的所有内容都无法完成。

更好的问题是,为什么要使用光标?游标几乎总是被错误地使用,我怀疑你是否真的需要一个。你到底想在这里实现什么?@Larnu实际上在-做一些事情-我创建另一个临时表Temp3并根据所选记录更新其值,然后使用Temp3值和所选光标值为4个不同的表插入值。为什么这意味着你需要一个光标?单次插入可以插入1行或多行。这4种不同的插入几乎肯定可以通过基于集合的逻辑来完成,而不是通过折磨行来完成RBAR行。更好的问题是,为什么要使用光标?游标几乎总是被错误地使用,我怀疑你是否真的需要一个。你到底想在这里实现什么?@Larnu实际上在-做一些事情-我创建另一个临时表Temp3并根据所选记录更新其值,然后使用Temp3值和所选光标值为4个不同的表插入值。为什么这意味着你需要一个光标?单次插入可以插入1行或多行。这4种不同的插入几乎可以通过基于集合的逻辑来完成,而不是通过折磨行来完成RBAR行。正如您所说,我在IF条件之前添加了一个集合@lineNo,现在它工作得很好。谢谢。正如你所说,我在IF条件之前添加了一组@lineNo,现在它工作得很好。非常感谢。