Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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_Tsql_Stored Procedures - Fatal编程技术网

SQL游标进入无限循环

SQL游标进入无限循环,sql,sql-server,tsql,stored-procedures,Sql,Sql Server,Tsql,Stored Procedures,这个sql进入无限循环 我找不出它有什么毛病。我搜索了其他帖子,但大部分都没有找到end标记之前的最后一个fetch语句。我肯定我看错了什么,但我不知道是什么。我错过什么了吗 下面是我的代码 DECLARE @counter INT = 1042, @overwrite_text NVARCHAR(250), @sequence INT, @is_correct BIT, @score INT, --@form_question_id

这个sql进入无限循环

我找不出它有什么毛病。我搜索了其他帖子,但大部分都没有找到end标记之前的最后一个fetch语句。我肯定我看错了什么,但我不知道是什么。我错过什么了吗

下面是我的代码

    DECLARE 
    @counter INT = 1042,
    @overwrite_text NVARCHAR(250), 
    @sequence INT,
    @is_correct BIT,
    @score INT,
    --@form_question_id INT,
    @question_answer_id INT;

DECLARE cursor_form_answer CURSOR
FOR SELECT
      [overwrite_text]
      ,[sequence]
      ,[is_correct]
      ,[score]
      --,[form_question_id]
      ,[question_answer_id]
  FROM [form_question_answer];

OPEN cursor_form_answer;

FETCH NEXT FROM cursor_form_answer INTO 
    @overwrite_text, 
    @sequence,
    @is_correct,
    @score,
    --@form_question_id,
    @question_answer_id;

WHILE @@FETCH_STATUS = 0
    BEGIN

        INSERT INTO [form_question_answer] (overwrite_text, sequence, is_correct, score, form_question_id, question_answer_id)
        VALUES (@overwrite_text, @sequence, @is_correct, @score, @counter, @question_answer_id);

        SET @counter = @counter + 1;

        FETCH NEXT FROM cursor_form_answer INTO 
            @overwrite_text, 
            @sequence,
            @is_correct,
            @score,
            --@form_question_id,
            @question_answer_id;
    END;

CLOSE cursor_form_answer;

DEALLOCATE cursor_form_answer;
这里根本不需要光标。只需使用选择按钮插入数据:


然而,我必须说,从表表单中捕获数据,然后将其插入到所述表中,这似乎真的很奇怪。

默认情况下,光标是动态的,它在每次迭代时读取表。在代码中,每次迭代时都会插入新行,并且光标永远不会到达表的末尾

如果要对现有数据进行一次传递,只需将光标声明为静态:

DECLARE cursor_form_answer CURSOR STATIC
或者,如果您的数据支持,您可以将动态光标的范围仅限于现有行,例如,有一个标识列,这里有一条关于光标评估的细微差别/细线

--this.. if sequence is autoincrement
DECLARE cursor_form_answer CURSOR 
FOR SELECT
      ...
from [form_question_answer]
where [sequence] <= (select max([sequence]) from [form_question_answer])

是的,这是因为您在用于循环的同一个表中插入了记录。 例如,如果表中有一条记录,那么插入的记录将是下一次提取,也是一个无限循环。

为什么在这里使用光标?插入到…选择中有什么问题?
--this.. if sequence is autoincrement
DECLARE cursor_form_answer CURSOR 
FOR SELECT
      ...
from [form_question_answer]
where [sequence] <= (select max([sequence]) from [form_question_answer])