临时表与通过MS SQL中的WITH关键字启动的表有何不同?

时间:2019-07-03 12:02:18

标签: sql sql-server

我在从此代码了解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时不使用@。我仍然阅读它类似于临时表。 到底有什么区别?在这种情况下有什么区别?

谢谢您的帮助:)

1 个答案:

答案 0 :(得分:3)

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

这里有一个Common Table Expression。 它基本上是一个命名结果集,不会持久保存为实际的物理表。

该查询存在的时间与您运行查询的时间一样长,其中包含您在SELECT子句中“填充”了该查询的数据。