我们知道,在 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/