我们知道在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表浏览器中看到这个表吗?
如果我开始在表名之前添加多个#(哈希值),会发生什么?
答案 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)
)
。
答案 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
总之,第二个哈希之后的任何内容都成为表名的一部分,它将被保存为全局临时表。