何时以及为何在 SQL 服务器中使用全局临时 table 而不是本地临时 table

When and Why to use global temporary table over local temporary table in SQL Server

我有一个像这样的本地临时 table:

create table #tbl
(
    employeeId int,
    employeeName nvarchar(50)
)

insert into #tbl
values (1, 'a'), (2, 'b'),
       (3, 'c'), (4, 'd')

select * from #tbl

现在我可以在特定用户会话和特定查询中访问本地临时文件 table window 与我可以访问全局临时文件的全局临时文件 table 相比table 在任何查询 window 中,直到创建的查询 window 关闭,到目前为止一切顺利。

现在我无法理解为什么需要全局临时 table。

我的问题是:

  1. 全局临时table实例是特定的吗?如果是,那么其他用户如何获得新创建的全局临时文件 table

  2. 什么原因 SQL 服务器开发全局临时 table 而不是本地临时 table?

就我个人而言,我认为不需要全局临时 table。我倾向于将此类数据与其他 table 一起存储在 table 中。但是,很明显,它们确实满足了需求。

第一个问题的答案是全局临时 table 是特定于实例的——如果您指的是 SQL 服务器实例。它们对服务器上的所有用户和所有连接都可用。全局临时 table 以前缀 ## 开头。所有对此类 table 的引用,例如 ##table,都是对相同的 table(在服务器实例中)。

第二个的答案是 SQL 服务器支持全局和本地临时 table。本地临时 table 更常见。所有临时 table 都有一个很好的功能,即当它们在服务器重新启动和其他情况下自动删除时消失。

全局临时 tables 的主要问题是名称在所有会话中必须是唯一的,对于本地临时 tables 它只在一个会话中。因此在实践中本地温度 tables 通常更实用。如果本地临时 table 包含并非所有服务器用户都应该能够看到的数据,它们也会更安全。

我偶尔会发现全局临时 table 在动态 SQL 中创建它们时很有用,并希望它们在动态 SQL 结束时在外部范围内可用时继续存在。

然而,这只是我在临时查询时使用的东西。在生产代码中,由于多种原因,这会很臭。

同样,临时查询能够检查从另一个 SSMS 连接写入全局临时文件 table 的进程的进度,有时也非常方便。

聚会有点晚,但本地临时 table 存在于创建它的连接范围内。如果您将 SQL 创建为字符串,然后使用 sp_executesql 到 运行 它,临时 table 将在存储过程执行范围内创建,并且不会存在当存储过程完成时。

例如:

DECLARE @TestSQL nvarchar(200)

SET @TestSQL = 'SELECT TOP 10 * INTO #Department FROM dbo.st_DEPT_TABLE'

EXEC sp_executesql @TestSQL

SELECT *
FROM
   #Department

-- Returns "Invalid object name #Department"

如果我对全局临时 table 做同样的事情,它 returns 10 条记录。