首页 > 解决方案 > 临时表与通过 MS SQL 中的 WITH 关键字启动的表有何不同?

问题描述

我在从这段代码中理解 SOURCETABLE 表时遇到问题:

CREATE PROCEDURE [ifc_tt].[SendTimeBalance]
AS
     DECLARE @endOfPreviousMonth DATE;
     DECLARE @now DATETIME= GETDATE();
     SELECT @endOfPreviousMonth = EOMONTH(GETDATE(), -1);
     WITH sourceTable
          AS (SELECT w.EmployeeId AS corporateId, 
                     w.Date AS date, 
                     w.logaValue AS flextimeHours
              FROM rpt_tt.DQC_TimeBalance AS w
              WHERE w.Date <= @endOfPreviousMonth)
          MERGE INTO ifc_tt.TimeBalance AS t
          USING sourceTable AS s
          ON t.corporateId = s.corporateId
             AND t.date = s.date
              WHEN NOT MATCHED BY TARGET
              THEN
                INSERT(corporateId, 
                       date, 
                       flextimeHours, 
                       overtimeHours, 
                       lastUpdate, 
                       Comment)
                VALUES
          (s.corporateId, 
           s.date, 
           s.flextimeHours, 
           NULL, 
           @now, 
           NULL
          )
              WHEN MATCHED
              THEN UPDATE SET 
                              t.flextimeHours = s.flextimeHours, 
                              t.lastUpdate = @now;
     RETURN 0;

通常,当我看到临时表时,它们以 @ 开头(参见 @endOfPreviousMonth)。

但在这种情况下,使用 sourcetable 时没有 @。我仍然读到它类似于临时表。这里到底有什么区别,在这种情况下又如何?

谢谢您的帮助 :)

标签: sqlsql-server

解决方案


@以您引用的 ( ex. @table1)开头的表是表变量临时表是您使用#(会话的本地表)或##(全局临时表)定义的表。Ex. #tempTable1, ##tempTable2.

您在这里拥有的是一个Common Table Expression。它基本上是一个命名的结果集,它不会作为真实的物理表持久化。

只要您运行查询,它就存在,包含您在SELECT子句中“填充”它的数据。


推荐阅读