1

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

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

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

select * from #tbl

现在我可以访问该特定用户会话和该特定查询窗口中的本地临时表,与全局临时表相比,我可以在任何查询窗口中访问全局临时表,直到创建的查询窗口关闭为止超好的。

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

我的问题是:

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

  2. SQL Server 在本地临时表上开发全局临时表的原因是什么?

4

3 回答 3

1

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

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

第二个问题的答案是 SQL Server 同时支持全局临时表和本地临时表。本地临时表更常见。所有的临时表都有一个很好的特性,当它们在服务器重新启动和其他情况下被自动删除时它们会消失。

于 2018-11-11T13:57:53.593 回答
1

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

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

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

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

于 2018-11-11T14:12:27.483 回答
0

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

例如:

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"

如果我对全局临时表做同样的事情,它会返回 10 条记录。

于 2021-03-31T15:07:08.477 回答