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的范围,但是在存储过程中,它们是完全不同的
谁能告诉我
多次执行localtemp1存储过程有输出,第一次执行globaltemp1 sp有输出,第二次出错
据我所知,在执行存储过程后,temptable 会被删除。那为什么 localtemp1 存储过程在所有会话中执行了很多次?
为什么 globaltemp1 存储过程执行一次和第二次显示错误?
最后一个,Globaltemp 存储过程仅在创建的会话关闭时才第一次在另一个会话中显示输出
我是说
- 56 ----> globaltemp sp 已创建
- 57 ----> 要获得 o/p 我需要关闭 56
- 58 ----> 要获得 o?p 我需要关闭 57(为什么???)
我是 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.
图片 #1:我正在创建一个用于将记录插入 #t1
的存储过程。
在同一个会话中,我多次执行 Localtemp1 存储过程,它工作正常:
图片 #2:再次在另一个会话中执行存储过程并且工作正常:
图片 #3:正在创建用于将记录插入 ##tt
的存储过程。第一次执行globaltemp1存储过程,运行良好:
图片#4:但是当我第二次执行它时,它显示错误(在数据库中不存在):
图片 #5:然后我关闭了创建 globaltemp 存储过程的会话,并在一个新会话中执行了该存储过程,这是第一次运行良好:
图片#6:但是当我第二次执行它时,它再次显示错误(在数据库中不存在):
我知道的是local temp和global temp的范围,但是在存储过程中,它们是完全不同的
谁能告诉我
多次执行localtemp1存储过程有输出,第一次执行globaltemp1 sp有输出,第二次出错
据我所知,在执行存储过程后,temptable 会被删除。那为什么 localtemp1 存储过程在所有会话中执行了很多次?
为什么 globaltemp1 存储过程执行一次和第二次显示错误?
最后一个,Globaltemp 存储过程仅在创建的会话关闭时才第一次在另一个会话中显示输出
我是说
- 56 ----> globaltemp sp 已创建
- 57 ----> 要获得 o/p 我需要关闭 56
- 58 ----> 要获得 o?p 我需要关闭 57(为什么???)
我是 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.