具有###(三重)或更多哈希值的临时表

时间:2014-11-12 10:21:09

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

我们知道在SQL Server中,使用#创建表意味着“本地临时表”而##意味着“全局临时表”。

但是当我创建一个如下表格时:

create table ###MyTable(IntColumn int, ValueColumn varchar(100))

此表是本地或全局临时表吗?我该怎么测试呢?当我通过以下方式尝试select时:

Select * from #MyTable -- SQL said it doesn't exists
Select * from ##MyTable -- SQL said it doesn't exists
Select * from ###MyTable -- I get the output

如果第三种情况为真,那是不是意味着这是名为###MyTable的通用表?我不会像我的其他物理表一样在我的SSMS表浏览器中看到这个表吗?

如果我开始在表名之前添加多个#(哈希值),会发生什么?

2 个答案:

答案 0 :(得分:3)

这是 global temp table. 它正在考虑将第三个#作为表名的一部分。如果您检查temdb database,则可以看到没有会话ID的表。如果临时表创建为本地临时表,那么您可以看到特定的sessionID将附加临时表名称,因为没有session ID附加临时表名,所以它是{{1} }。

global temp table

运行上述查询后

GOTO服务器 - >数据库 - >系统数据库 - > Tempdb - >临时表

您可以像下面的图片一样找到创建的CREATE TABLE ###MyTable ( IntColumn INT, ValueColumn VARCHAR(100) )

enter image description here

答案 1 :(得分:3)

具有三重哈希的表只是一个常规的全局临时表,其中第三个哈希已经成为表名的一部分,而不是做任何特殊的事情。

-- global temp table name: #temp
SELECT 1 AS value
INTO ###temp

-- global temp table name: temp
SELECT 2 AS value
INTO ##temp

-- temp table name: temp
SELECT 3 AS value
INTO #temp

select * from   tempdb.INFORMATION_SCHEMA.TABLES 

执行结果时上面的SQL显示所有对象都按照您的预期添加到临时数据库中。

要测试该理论,如果在新查询窗口中运行以下内容,则应该只能访问带有##前缀的全局临时表:

-- this one is accessible
SELECT *
FROM ###temp

-- this one is accessible    
SELECT *
FROM ##temp

-- this one won't work as it's out of scope in a new query window
SELECT *
FROM #temp

总之,第二个哈希之后的任何内容都成为表名的一部分,它将被保存为全局临时表。