sql-server - 带有###(三重)或更多哈希值的临时表

标签 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 表浏览器中看到这张表吗?

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

最佳答案

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

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

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

关于sql-server - 带有###(三重)或更多哈希值的临时表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26884520/

相关文章:

mysql - 如何在 SQL Server 中写入 (MySQL) "LIMIT"?

c# - 为什么 C# 代码不从存储过程返回值

mysql - 可以在 MySQL 中使用 'For Each' 循环来生成带有变量的临时表吗?

tsql - 从 sp_executsql 插入临时表

sql-server - EF Core Linq 中子查询的总和

python - pypyodbc 不提交

mysql - 我应该如何在存储过程中临时存储行?

mysql - 在没有临时表的情况下从 MIN 小时中选择一天的 MIN 时间?

sql - MS SQL 临时表