何时以及为何在SQL Server中使用全局临时表而不是本地临时表

时间:2018-11-11 13:48:17

标签: sql sql-server temp-tables global-temp-tables

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

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在本地临时表上开发全局临时表的原因是什么?

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

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

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

对于临时查询来说,再次检查从另一个SSMS连接写入全局临时表的进程的进度有时也很方便。

答案 2 :(得分: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 条记录。