【问题标题】:can we use two different queries with CTE table in sql server我们可以在 sql server 中对 CTE 表使用两个不同的查询吗
【发布时间】:2020-01-08 08:57:28
【问题描述】:

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

insert 语句已执行,但系统在 update 语句处抛出错误。

【问题讨论】:

  • 简单回答:不,你不能。

标签: sql sql-server common-table-expression


【解决方案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;

【讨论】:

  • 这太棒了。;它像专业人士一样工作。谢谢你:)
  • @pratikmokal 。 . .如果这回答了您的问题,您应该接受答案。
猜你喜欢
  • 2010-12-27
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-11
  • 1970-01-01
  • 2011-05-13
相关资源
最近更新 更多