我有一个像这样的本地临时表:
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在本地临时表上开发全局临时表的原因是什么?
答案 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 条记录。