我在从此代码了解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时不使用@。我仍然阅读它类似于临时表。 到底有什么区别?在这种情况下有什么区别?
谢谢您的帮助:)
答案 0 :(得分:3)
您所引用(@
以ex. @table1
开头的表是table variables。
Temporary tables是您使用#
(会话的本地变量)或##
(全局临时表)定义的变量。 Ex. #tempTable1, ##tempTable2.
这里有一个Common Table Expression。 它基本上是一个命名结果集,不会持久保存为实际的物理表。
该查询存在的时间与您运行查询的时间一样长,其中包含您在SELECT
子句中“填充”了该查询的数据。