SQL SERVER 2017中在定时任务中将数据插入到tempdb..##Result和插入到实体表Result中,会发生什么情况?

1 阅读2分钟

在 SQL Server 2017 中,定时任务(通常通过 SQL Agent 作业实现)执行时,临时表(##Result)和实体表(Result)的数据是否可查询取决于任务执行状态和会话上下文。以下是详细分析:

一、全局临时表(##Result)的可见性

1. 基本规则

  • 全局临时表(以 ## 开头)对所有会话可见,但仅在创建它的会话结束后才会被自动删除
  • 如果定时任务是通过 SQL Agent 作业执行的,每个作业步骤会在独立的会话中运行。

2. 场景分析

  • 任务执行期间:若作业步骤 1 创建并插入数据到 ##Result,作业步骤 2 或其他会话可以查询该表。
  • 任务执行结束后:一旦作业会话结束,##Result 会被自动删除,此时任何查询都会失败。
-- 任务步骤 1:创建并插入数据到全局临时表
SELECT *
INTO ##Result
FROM YourSourceTable;

-- 任务步骤 2:查询全局临时表(需在同一会话链中)
SELECT * FROM ##Result;

二、实体表(Result)的可见性

1. 基本规则

  • 实体表存储在数据库中,除非手动删除,否则永久存在。
  • 只要表存在且用户有查询权限,任何会话都可以随时查询。

2. 场景分析

  • 任务执行期间:作业插入数据到 Result 后,其他会话即可查询。
  • 任务执行结束后:数据仍然保留,可继续查询。

3. 示例代码

-- 任务步骤 1:创建并插入数据到实体表(需先确保表不存在)
IF OBJECT_ID('Result', 'U') IS NOT NULL
    DROP TABLE Result
    
 SELECT * INTO Result FROM YourSourceTable;

-- 任务结束后,任何会话都可查询
SELECT * FROM Result;

三、核心区别与建议

对比项全局临时表(##Result实体表(Result
数据持久性会话结束后自动删除永久存在,需手动删除
跨会话可见性所有会话可见(会话存活期间)所有会话可见
定时任务后能否查询否(任务结束后表被删除)是(数据永久保留)
适用场景临时中间结果,无需长期保留需要长期存储或后续分析的数据

四、常见问题与解决方案

1. 临时表在任务结束后无法查询

  • 原因:SQL Agent 作业步骤结束后,会话关闭,临时表被删除。

  • 解决方案

    • 使用实体表存储需要长期保留的数据。
    • 若必须用临时表,可在同一会话链中完成所有操作(例如将多个步骤合并为一个脚本)。

五、总结

  • 若需要在定时任务结束后查询数据,必须使用实体表(如 Result)。
  • 若仅在任务执行期间需要临时结果,可使用全局临时表(##Result),但需确保所有查询操作在同一会话中完成。