我有一个本地临时表,如下所示:
create table #tbl
(
employeeId int,
employeeName nvarchar(50)
)
insert into #tbl
values (1, 'a'), (2, 'b'),
(3, 'c'), (4, 'd')
select * from #tbl
现在,我可以在特定的用户会话和特定的查询窗口中访问本地临时表,而在全局临时表中,我可以访问任何查询窗口中的全局临时表,直到创建的查询窗口关闭,到目前为止一切都很好。
现在我无法理解为什么需要一个全局临时表。
我的问题是:
全局临时表实例特定吗?如果是,那么其他用户如何获得新创建的全局临时表
SQL Server开发全局临时表而不是本地临时表的原因是什么?
就我个人而言,我认为不需要全局临时表。我倾向于将这些数据与其他表一起存储在表中。但是,很明显,它们确实满足了需求。
第一个问题的答案是全局临时表是特定于实例的——如果您所说的实例是指SQL Server实例。它们对服务器上的所有用户和所有连接都可用。全局临时表以前缀##
开头。对这样一个表的所有引用,比如##table
,都指向同一个表(在服务器实例中(。
第二个问题的答案是SQL Server同时支持全局和本地临时表。本地临时表更常见。所有临时表都有一个很好的功能,即在服务器重新启动和其他情况下,当它们被自动删除时,它们就会消失。
全局临时表的主要问题是名称必须在所有会话中都是唯一的,而对于本地临时表,它只在会话中。因此,在实践中,本地临时表通常更实用。如果本地临时表包含并非所有服务器用户都能看到的数据,那么它们也更安全。
当在动态SQL中创建全局临时表时,我偶尔会发现它们很有用,并希望它们在动态SQL结束时在外部范围中可用。
然而,这只是我在临时查询时使用的东西。在生产代码中,由于多种原因,这会很臭。
同样,对于自组织查询来说,能够检查从另一个SSMS连接写入全局临时表的进程的进度偶尔也会很方便。
参与方稍晚,但本地临时表存在于创建它的连接的范围内。如果将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条记录。