sql - 临时表与通过 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 时没有 @。我仍然读到它类似于临时表。这里到底有什么区别,在这种情况下又如何?
谢谢您的帮助 :)
解决方案
@
以您引用的 ( ex. @table1
)开头的表是表变量。
临时表是您使用#
(会话的本地表)或##
(全局临时表)定义的表。Ex. #tempTable1, ##tempTable2.
您在这里拥有的是一个Common Table Expression。它基本上是一个命名的结果集,它不会作为真实的物理表持久化。
只要您运行查询,它就存在,包含您在SELECT
子句中“填充”它的数据。
推荐阅读
- python - 在 django 中添加和显示电子书
- django - 管理员使用 django-rest-framework 和 djoser 注册用户并随后激活
- selenium - 当我登陆网站时,我无法关闭网站上出现的第一个弹出窗口(https://www.seleniumeasy.com/test/)
- sql-server - 如何连接到在 docker 容器中创建的 SQL Server
- javascript - 单选按钮和普通按钮不通信
- javascript - 在 THREE.js 中渲染多个框并存储在 3 维数组中
- directus - Express-session 已弃用 req.secret;提供秘密选项
- facebook - 如何在网站上导入 facebook 朋友,以便他们可以看到彼此的帐户?
- go - 戈朗 | 将指针分配给指针接收器不起作用
- html - 使用过渡时的vue模态丢帧