Temp Table 如何在存储过程中工作(全局和本地)

How Temp Table works in Stored Procedures (global & local )

图片 #1:我正在创建一个用于将记录插入 #t1 的存储过程。 在同一个会话中,我多次执行 Localtemp1 存储过程,它工作正常:

图片 #2:再次在另一个会话中执行存储过程并且工作正常:

图片 #3:正在创建用于将记录插入 ##tt 的存储过程。第一次执行globaltemp1存储过程,运行良好:

图片#4:但是当我第二次执行它时,它显示错误(在数据库中不存在):

图片 #5:然后我关闭了创建 globaltemp 存储过程的会话,并在一个新会话中执行了该存储过程,这是第一次运行良好:

图片#6:但是当我第二次执行它时,它再次显示错误(在数据库中不存在):

我知道的是local temp和global temp的范围,但是在存储过程中,它们是完全不同的

谁能告诉我

  1. 多次执行localtemp1存储过程有输出,第一次执行globaltemp1 sp有输出,第二次出错

  2. 据我所知,在执行存储过程后,temptable 会被删除。那为什么 localtemp1 存储过程在所有会话中执行了很多次?

  3. 为什么 globaltemp1 存储过程执行一次和第二次显示错误?

  4. 最后一个,Globaltemp 存储过程仅在创建的会话关闭时才第一次在另一个会话中显示输出

我是说

我是 SQL 的初学者,请有人让我理解,因为如果我找不到逻辑和正确的理由,我将无法深入研究另一个主题。

局部临时table仅在当前会话可见,全局临时table对所有会话可见。当创建 table 的会话结束并且所有其他任务已停止引用它们时,全局临时 table 将自动删除。任务和 table 之间的关联仅在单个 Transact-SQL 语句的生命周期内保持。这意味着全局临时 table 在创建会话结束时主动引用 table 的最后一个 Transact-SQL 语句完成时被删除。

temp table 的概念是临时保存记录。它是某种数组,您可以在其中使用相同的变量存储多个记录。

创建Temp时Table,实际上是在对应服务器的tempdb中创建的。即使你只是将它命名为 #temp,在 tempdb 上创建它的名称也会有一些额外的参数,比如你的数据库名称,table 是从中创建的,你的会话 ID 等。

我刚刚在我的主数据库中创建了以下临时文件 table

这就是它在 tempdb 中的命名方式

仍然,在我的数据库中,我可以使用名称#temp 访问它。但是这种 temp table 的局限性在于它们是本地的并且只能从该会话访问,所以如果我尝试从任何其他查询 Window (会话)访问这个#temp,即使在同一个数据库,我将无法访问它。那就是我们使用 Global temp tables 的地方。因此,如果我在 table 名称中再添加一个 #,那么它将变为全局临时 table,可以跨会话访问。它仍然在 Tempdb 上创建,但像这样

每当您关闭查询时 window/session 本地和全局温度 table 都会自动删除。

所以在存储过程的情况下,sp的开始和结束时间被视为一个会话。因此,一旦 sp 执行完成,所有在该 sp 中创建的临时 tables 都将被删除。因此,您不能在另一个 SP 中使用由一个 SP 创建的临时 table。

希望对您有所帮助

如果您绝对必须有一个可用的全局临时文件 table,您最好的解决方案是创建一个永久性的 table,然后在存储的末尾删除 table程序。您可以在创建它之前检查它是否存在:

IF OBJECT_ID('dbo.yourtablenamehere', 'U') 不为空 丢弃 TABLE dbo.yourtablenamehere;

临时 table 和永久 table 之间的区别实际上并没有太大区别,主要是临时 table 自动下降。如果您在调用此过程的应用程序中使用它,最好让应用程序将临时 table 加载到数组中并为您进行比较,因为它可以在执行和重新执行时维护数组存储过程。

有充分的理由写入临时 table 而不是创建 table 然后删除它...访问权限。如果您创建的 table 供仅被授予只读权限的人使用,他们将无法创建 table.