TSQL,为什么在存储过程每次重新创建时在存储过程中使用全局 table (##table)?运行?

TSQL, Why use a global table (##table) within a stored procedure when it is recreated every time the stored procedure is run?

我正在优化一些旧的 tsql 查询。

我找到了几个使用##table 的全局临时table。

SQL Server tables: what is the difference between @, # and ##?

不过我看到的是,在这些存储过程的顶部,它会检查这个 ##table 是否存在,如果存在,它会删除 table 然后继续重新创建这个 ##table。这些是唯一使用此 ##table.

的存储过程

我的问题是,为什么您每次都重新创建它时会使用全局 table (##table)?通过##table 是否比#table(本地table)获得了一些效率?

我想用 #table 替换这些 ##table,因为它们不是真正的全球性但不想引起效率问题或引起问题是由于我对这些 ##table(s) 缺乏了解。 (当查询同时为 运行 且两者都试图删除并重新创建 table 时,这也会导致一些瞬间问题,而实际上如果它们是内部 tables #table,永远不会出现这个问题)

我第一次 运行 进入 ##tables.

t@、# 和## 之间的区别是:

@ 仅在声明它的批次中可见。例子

DECLARE @t AS TABLE (c INT NOT NULL ); 

INSERT INTO @t VALUES(1) --correct
GO
INSERT INTO @t VALUES(2) --error. after GO it is another batch

# 在创建该临时本地 table 的会话中可见。例子

CREATE TABLE #t (c INT NOT NULL ); 

INSERT INTO #t  VALUES(1) --correct
GO
INSERT INTO #t  VALUES(2) --correct

## 对所有会话可见,而创建的临时全局 table 会话未终止。例子: 开两个SSMSwindows。一次创建 table CREATE TABLE ##t (c INT NOT NULL ); 从其他 windows 尝试选择 SELECT * FROM ##t --no error 先关闭window。再试一次SELECT * FROM ##t --error. session that created temp global table was terminated

所以答案是:如果您需要多个会话使用相同的温度 table,您应该使用 ##,否则使用 #。如果只有一批,则使用 @.

@ 变量在批处理结束时被销毁。

# 你可以手动删除 table 否则它会在创建它的关卡终止时被销毁。

## 您可以手动删除 table 否则它会在创建它的会话终止时被销毁。