【问题标题】:Global temp tables getting dropped in Microsoft Sql Server全局临时表在 Microsoft Sql Server 中被删除
【发布时间】:2015-10-14 04:52:10
【问题描述】:

我们有一组在 SP 中创建并填充的全局临时表。这就是从应用程序调用的主 sp。

现在说我是第一个调用主 SP 的用户,全局临时表被创建并且一切正常。但有时(可能是当多个用户访问主 SP 时)表被删除并收到一条错误消息,指出对象名称无效

其他人也面临同样的问题,全局临时表被删除??

提前致谢!!

【问题讨论】:

  • 为什么要使用全局临时表而不是真实表?
  • 每个用户都创建自己的临时表吗?
  • 全局临时表是如何创建的,比如If exists drop and recreate 或者什么
  • 是的,我们检查 IF OBJECT_ID('tempdb...[Global Temp table]') IS null 然后创建

标签: sql-server global-temp-tables


【解决方案1】:

您可以在创建temp table之前检查该表是否存在。
而不是global temp table,如果表只在存储过程的范围内使用,首选local temp tablestable variable

在存储过程中创建的本地临时表会在存储过程完成后自动删除。该表可以被创建该表的存储过程执行的任何嵌套存储过程引用。调用创建表的存储过程的进程无法引用该表

所有其他本地临时表在当前会话结束时自动删除

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

在创建本地临时表之前,

IF OBJECT_ID('tempdb..#local_temp_table') IS NOT NULL DROP TABLE #local_temp_table
CREATE TABLE #local_temp_table(id int)

或表变量

declare @table_var table(id int)

【讨论】:

  • 不,我们需要一种其他用户可以在应用程序中使用临时表的方法。因此我们选择了全局临时表。但是尽管全局临时表不会被删除,除非没有活动会话,即使环境中只有一个用户,即使他收到错误消息“无效对象 [全局临时表名称] "
猜你喜欢
  • 2010-10-15
  • 2012-10-17
  • 2011-12-17
  • 2021-11-19
  • 2014-09-01
  • 2012-02-13
  • 1970-01-01
  • 2011-07-10
  • 2010-12-07
相关资源
最近更新 更多