【问题标题】:Why global temp table doesn't gets dropped even after checking table exists condition为什么即使在检查表存在条件后全局临时表也不会被删除
【发布时间】:2018-04-12 10:44:37
【问题描述】:

我正在运行一个 sql server 脚本,我正在检查它是否存在全局临时表,然后删除它。但是我观察到,即使在表存在之后,编译器也不会进入删除表范围。

IF OBJECT_ID('tempdb..##TuidSubgroupAuthrealm') IS NOT NULL
BEGIN
    DROP TABLE ##TuidSubgroupAuthrealm
END

CREATE TABLE ##TuidSubgroupAuthrealm
( 
    TUID INT NOT NULL, 
    TravelProductId INT NOT NULL, 
    AuthRealmId INT NOT NULL
    PRIMARY KEY (TUID, TravelProductId)
)

select * from ##TuidSubgroupAuthrealm 查询时,我得到了表,但是脚本在创建表时中断。有什么原因以及如何解决?

【问题讨论】:

  • 我看不出代码有什么问题。
  • 如果您使用的是全局表,我猜您有使用它们的并发进程。也许你有赛车条件来放弃/创造它?
  • 为什么要使用全局临时表?一般来说,它们不是一个好主意。
  • 不,我几天前创建了这个同名的表。我知道我是唯一一个运行此脚本的人,除了原始创建者(即较旧的连接)之外,没有其他连接正在使用此脚本。使用全局临时表的原因是为了调试来自另一个连接的并行数据处理。
  • 您真的需要一个全局临时表,即该临时表是否在创建范围之外的会话中使用?如果没有,请改用本地临时表。此外,您应该在不再需要临时表时立即删除它。反转它,即在你需要创建它之前删除它,不是你应该如何处理这些的。它表明您的脚本存在问题,因为当您输入脚本并假设它可能存在时,即它可以在另一个范围内使用,然后您继续删除它?你知道我在说什么吗?

标签: sql-server sql-server-2008 sql-server-2012


【解决方案1】:

您应该将DROPCREATE 语句分批分开。 如果您使用的是 SSMS,请尝试在它们之间放置一个 GO 分隔符。

【讨论】:

  • 这是一种更好的编码习惯,我正在寻找根本原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-17
  • 2021-11-19
  • 1970-01-01
  • 2014-08-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
相关资源
最近更新 更多