мы можем использовать два разных запроса с таблицей CTE на сервере sql - PullRequest
0 голосов
/ 08 января 2020

Я хочу использовать таблицу CTE для двух запросов. при попытке, как показано ниже, выдается ошибка:

Неверное имя объекта 'cte'.

;

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
    )
INSERT INTO logdata
SELECT PERSONNUM
    ,DATE
    ,HOURS
FROM cte
WHERE rno = 1

UPDATE cte
SET hours = hours + 0.01
WHERE rno = 1

оператор вставки выполнен, но система выдает ошибку в операторе обновления .

1 Ответ

4 голосов
/ 08 января 2020

Вы не можете использовать 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;
...