Добавляя значение плюс 1 каждый раз как обновление - PullRequest
0 голосов
/ 09 ноября 2018

В Advantage пытается обновить значение во временной таблице, но каждый раз добавляет 1. Начальное значение должно быть на одно больше максимального значения из другой таблицы, и каждый раз, когда обновляется новая строка, к ней добавляется одна. Игнорировать все, кроме объявления курсора и строк @nevid вверху. Я могу получить его для заполнения столбца evid в моей временной таблице, но он добавляет 71 к каждой записи, что является правильным следующим числом, но мне нужно, чтобы оно было 71,72,73 и т. Д. Куда я иду не так?

DECLARE cur CURSOR;
DECLARE @nevid INTEGER;
DECLARE @startdate string;
DECLARE @starttime string;
DECLARE @expectedenddate string;
DECLARE @expectedendtime string;
DECLARE @enddate string;
DECLARE @endtime string;
@nevid = 
( 
       SELECT (max(evid)+1) 
       FROM   pcplevnt
);

SELECT * 
INTO   #tmpev 
FROM   <table>;open cur 
AS 
  SELECT * 
  FROM   #tmpev;
    WHILE
        FETCH cur do 
        UPDATE #tmpev 
        SET evid = cast(@nevid AS sql_char(4));SET @nevid = @nevid + 1;
    END WHILE;
close cur;

1 Ответ

0 голосов
/ 09 ноября 2018

Я собрал MVCE, чтобы воспроизвести и исправить вашу проблему:

DECLARE cur    CURSOR;
DECLARE @nevid INTEGER;

TRY DROP TABLE #pcplevnt; CATCH ALL END TRY; 
TRY DROP TABLE #tmpev;    CATCH ALL END TRY; 

CREATE TABLE
  #pcplevnt
(
  evid INTEGER
);

DELETE FROM #pcplevnt;
INSERT INTO #pcplevnt (evid) SELECT 111 FROM system.iota;

SET @nevid = (
SELECT
  max(evid) + 1
FROM #pcplevnt
);

CREATE TABLE
  #tmpev
(
  id AUTOINC,
  evid NVARCHAR(4)
);

INSERT INTO
  #tmpev
(
  evid
)
      SELECT '1' FROM system.iota
UNION SELECT '2' FROM system.iota
UNION SELECT '3' FROM system.iota
;

OPEN cur AS SELECT * FROM #tmpev;

WHILE FETCH cur DO
  UPDATE
    #tmpev
  SET
    evid = CAST(@nevid AS SQL_CHAR(4))
  WHERE
    id = cur.id
  ;
  SET @nevid = @nevid + 1;
END WHILE;

CLOSE cur;

select * from #tmpev;

Обратите внимание на условие WHERE во UPDATE внутри цикла:

  UPDATE
    #tmpev
  SET
    evid = CAST(@nevid AS SQL_CHAR(4))
  WHERE
    id = cur.id
  ;
  SET @nevid = @nevid + 1;

Я добавил поле первичного ключа id, с которым я могу сравнить внутри цикла, чтобы обновить только одну строку временной таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...