Вы не можете использовать CTE более чем в одной инструкции, их область действия находится на уровне инструкции. Однако вы можете использовать предложение OUTPUT
для захвата обновленных строк и вставки их в таблицу журналов:
WITH cte AS
(
SELECT ROW_NUMBER() OVER(PARTITION BY hours ORDER BY hours) AS rno,
personnum,
Date,
hours
FROM Datatable
WHERE personnum = @personnum
AND Hours = @minhrs
)
UPDATE cte
SET hours = hours + 0.01
OUTPUT deleted.personnum, deleted.Date, deleted.hours INTO logdata
WHERE rno=1;
Если ваша таблица журналов имеет внешний ключ После этого вам может понадобиться сохранить результаты во временной таблице перед их вставкой:
-- I have had to guess at types here, change them as necessary
DECLARE @tmpLog TABLE (PersonNum INT, Date DATE, Hours INT);
WITH cte AS
(
SELECT ROW_NUMBER() OVER(PARTITION BY hours ORDER BY hours) AS rno,
personnum,
DATE,
hours
FROM Datatable
WHERE personnum = @personnum
AND Hours = @minhrs
)
UPDATE cte
SET hours = hours + 0.01
OUTPUT deleted.personnum, deleted.DATE, deleted.hours INTO @tmpLog
WHERE rno=1;
INSERT LogData (personnum, Date, hours)
SELECT personnum, Date, hours
FROM @tmpLog;