簡體   English   中英

我們可以在 sql server 中對 CTE 表使用兩個不同的查詢嗎

[英]can we use two different queries with CTE table in sql server

我想將 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

已執行插入語句,但系統在更新語句中引發錯誤。

您不能在多個語句中使用 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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM