Как решить бесконечный цикл при просмотре таблицы с курсором? - PullRequest
0 голосов
/ 08 октября 2019

У меня есть следующий хранимый процесс, который не работает, каждый раз, когда я запускаю его, он остается в бесконечном цикле. Цель 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 голосов
/ 08 октября 2019

Я думаю, что вы можете пропустить FETCH NEXT FROM из вашего цикла.

Возвращаемое значение из @@ FETCHSTATUS

  • 0 Оператор извлечения успешен
  • -1 Выборкаоператор не выполнен или строка выходит за пределы результирующего набора
  • -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;  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...