Sql server 具有####(三重)或更多散列的临时表

Sql server 具有####(三重)或更多散列的临时表,sql-server,temp-tables,global-temp-tables,Sql Server,Temp Tables,Global Temp Tables,我们知道,在SQL Server中,使用创建表意味着“本地临时表”,而意味着“全局临时表” 但当我创建如下表时: create table ###MyTable(IntColumn int, ValueColumn varchar(100)) 此表是本地临时表还是全局临时表?我如何测试它?当我试图通过以下方式选择它时: Select * from #MyTable -- SQL said it doesn't exists Select * from ##MyTable -- SQL said

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

但当我创建如下表时:

create table ###MyTable(IntColumn int, ValueColumn varchar(100))
此表是本地临时表还是全局临时表?我如何测试它?当我试图通过以下方式选择它时:

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表资源管理器中,我不会像其他物理表一样看到这个表吗


如果我开始在表名之前添加多个#(散列),会发生什么情况?

这是一个
全局临时表。
它正在考虑将第三个
#
作为表名的一部分。如果您检查
temdb数据库
,您可以看到没有会话ID的表。如果临时表被创建为本地临时表,那么您可以看到特定的
sessionID
将被附加上一个诱人的名称,由于没有附加临时表名的
会话ID
,因此它是一个
全局临时表

CREATE TABLE ###MyTable
  (
     IntColumn   INT,
     ValueColumn VARCHAR(100)
  ) 
在运行上述查询之后

转到服务器->数据库->系统数据库->临时数据库->临时表

您可以找到创建的
全局诱惑
,如下图所示


具有三重散列的表只是一个常规的全局临时表,其中第三个散列已成为表名的一部分,而不是执行任何特殊操作

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

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

@Ganesh_Devlekar-是的,兄弟,应该在开头