5

我们知道,在 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 表资源管理器中看到此表吗?

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

4

2 回答 2

5

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

CREATE TABLE ###MyTable
  (
     IntColumn   INT,
     ValueColumn VARCHAR(100)
  ) 

运行上述查询后

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

您可以Global temptable像下图一样找到创建的。

在此处输入图像描述

于 2014-11-12T11:05:51.650 回答
5

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

-- 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 执行结果显示所有对象都已按您的预期添加到 temp db。

为了测试这个理论,如果你在一个新的查询窗口中运行以下命令,你应该只能访问带有##前缀的全局临时表:

-- 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

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

于 2014-11-12T11:05:59.040 回答