Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MS SQL中,临时表与通过WITH关键字启动的表有何不同?_Sql_Sql Server - Fatal编程技术网

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

在MS SQL中,临时表与通过WITH关键字启动的表有何不同?,sql,sql-server,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 (SELE

从以下代码中理解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;
通常,当我看到临时表时,它们以@see@endOfPreviousMonth开头

但在这种情况下,使用sourcetable时不带@。我仍然读到它类似于一个临时表。 这里的区别到底是什么?在这种情况下又是怎样的

感谢您的帮助:

您引用的以@开头的表格,例如@table1,如下所示。 是您使用本地临时表或全局临时表定义的临时表。例:诱人的1,诱人的2

你这里的是一本书。 它基本上是一个命名的结果集,而不是作为真正的物理表持久化


只要您正在运行查询,它就会一直存在,其中包含您在SELECT子句中填充的数据

WITH关键字用于创建CTE。请参阅此链接了解更多以开头的insight临时表名称。你指的是一个变量;表变量是一种东西,但这里不使用它们。引入的通用表表达式都不是;实际上,这是编写子查询的另一种方式。优化器通过将它们扩展到查询中来处理它们;它们不是首先实现的。