如何解决游标遍历表格中的无限循环?

时间:2019-10-08 13:10:51

标签: sql sql-server stored-procedures

我有以下无法使用的存储过程,每次运行时,它都处于无限循环中。 SP的目标是遍历每一行的产品表以评估结果,如果计算行数时的结果大于0,则必须在表中插入代码,如果结果为0,则记录必须根据第三个查询被插入。

WHILE @@FETCH_STATUS = 0
BEGIN

SELECT @QUERY = count (*)  from (
SELECT TOP 1  [ID],[code],[FEC_MAX],[FUENTE]FROM PRODUCTO
  WHERE ( FUENTE = 1 OR FUENTE =2 OR FUENTE = 3 ) and code = @CODE
  order by  FEC_MAX DESC 
  ) a 

IF @QUERY > 0
BEGIN
   INSERT INTO TEST
    SELECT @code,@fecha,@NOMBRE, @FUENTE , @ID ;
END
if @QUERY < 0
    INSERT INTO TEST
    SELECT top 1  @code,@fecha,@NOMBRE, @FUENTE , @ID
    FROM TEST
    WHERE  code = @code
    order by  FUENTE ASC

END

THNKS

1 个答案:

答案 0 :(得分:0)

我认为您可能会在循环中缺少FETCH NEXT FROM。

从@@ FETCHSTATUS返回值

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

光标停留在第一行,@@ FETCHSTATUS将始终返回成功。假设您已正确声明光标,则在循环内添加FETCH NEXT FROM,如下所示。它看起来应该像这样:

DECLARE YourCursorName CURSOR FOR  
SELECT col
FROM PRODUCTO
OPEN YourCursorName;  
FETCH NEXT FROM YourCursorName;  
WHILE @@FETCH_STATUS = 0
BEGIN

SELECT @QUERY = count (*)  from (
SELECT TOP 1  [ID],[code],[FEC_MAX],[FUENTE]FROM PRODUCTO
  WHERE ( FUENTE = 1 OR FUENTE =2 OR FUENTE = 3 ) and code = @CODE
  order by  FEC_MAX DESC 
  ) a 

IF @QUERY > 0
BEGIN
   INSERT INTO TEST
    SELECT @code,@fecha,@NOMBRE, @FUENTE , @ID ;
END
if @QUERY < 0
    INSERT INTO TEST
    SELECT top 1  @code,@fecha,@NOMBRE, @FUENTE , @ID
    FROM TEST
    WHERE  code = @code
    order by  FUENTE ASC

FETCH NEXT FROM YourCursorName

END
CLOSE YourCursorName;  
DEALLOCATE YourCursorName;