无限循环T-SQL

时间:2018-03-28 14:30:12

标签: sql-server tsql

CREATE OR ALTER PROCEDURE StudentsToGroups
   AS
   BEGIN
     DECLARE @num VARCHAR(15)
     DECLARE stud_cursor CURSOR 
     FOR 
     SELECT id FROM stud ORDER BY surStud, nameStud
     OPEN stud_cursor  
     FETCH NEXT FROM stud_cursor INTO @num

     WHILE @@FETCH_STATUS = 0  
     BEGIN
        BEGIN TRY
            EXEC @status = dbo.AddStudent @num
        END TRY
        BEGIN CATCH
            IF (ERROR_NUMBER() = 2 OR ERROR_NUMBER() = 3)
                CONTINUE; 
            ELSE IF ERROR_NUMBER() = 4
                THROW 5, 'Unsucessful', 1;
            ELSE
                THROW;
        END CATCH
        FETCH NEXT FROM stud_cursor INTO @num
    END
    CLOSE stud_cursor  
    DEALLOCATE stud_cursor 
END
GO

EXEC studentsToGroups

我的代码中的某些东西导致无限循环。我真的不明白为什么因为我在While循环中使用FETCH NEXT。此外,该程序正在完成它的工作,它填补了所有学生的群体,但它永远不会结束。

3 个答案:

答案 0 :(得分:7)

这是因为CONTINUE

  

忽略CONTINUE关键字后的任何语句。

因此,如果您有任何返回ERROR_NUMBER() 2或3的错误,您的FETCH NEXT将被忽略,而您的while循环将永久运行。

请注意,使用游标几乎从不在SQL中做正确的事情。 您最好创建一个新的过程,将学生ID作为批处理而不是逐个添加。

考虑到您的AddStudent过程只接受一个变量,它可能就像

一样简单
INSERT INTO dbo.Student (Id)
SELECT id 
FROM stud 
-- order by will probably be ignored anyway since database tables are onsorted by nature.

答案 1 :(得分:0)

谢谢,问题解决了! :) 我添加了

IF (ERROR_NUMBER() = 50501 OR ERROR_NUMBER() = 50502)
    BEGIN
       FETCH NEXT FROM stud_cursor INTO @JMBAG
       CONTINUE; 
    END

现在一切正常。

另外,关于解决方案,这是我们的功课,我们必须制作一个程序,将一个学生添加到一个组,然后另一个任务是从另一个程序调用第一个程序,将所有学生添加到组中。

答案 2 :(得分:0)

CONTINUE函数会中断当前循环,因此游标提取(FETCH NEXT FROM stud_cursor INTO @num)将不会为下一次交互而触发。