2010-04-15 110 views
5

我有一个客户端应用程序,它创建一个临时表,在临时表中执行批量插入,然后在删除它之前使用该表执行一些SQL。DROP TABLE失败的临时表

伪代码:

open connection 
begin transaction 
CREATE TABLE #Temp ([Id] int NOT NULL) 
bulk insert 500 rows into #Temp 
UPDATE [OtherTable] SET [Status]=0 WHERE [Id] IN (SELECT [Id] FROM #Temp) AND [Group]=1 
DELETE FROM #Temp WHERE [Id] IN (SELECT [Id] FROM [OtherTable] WHERE [Group]=1) 
INSERT INTO [OtherTable] ([Group], [Id]) SELECT 1 as [Group], [DocIden] FROM #Temp 

DROP TABLE #Temp 
COMMIT TRANSACTION 
CLOSE CONNECTION 

这是通过在DROP语句中的错误而失败:

无法删除表“#TEMP”,因为它不存在,或者您没有权限。

我无法想象如何在没有其他事情的情况下首先发生这种故障,但在此之前我没有看到任何其他故障发生。

有什么我可能会导致这种情况发生?

+0

一项建议,将创建,批量插入,以及拖放事务块之外声明。没有理由或需要锁定它,因为没有其他连接可以访问它。 – 2010-04-15 02:58:26

+0

@Philip凯利:这不是一个坏主意,我会看看我能做到这一点,以限制交易的长度,但我不能看到如何将导致此问题 – StarBright 2010-04-15 03:41:05

+0

的错误出现在空白要表现。 ;)一个完整的repro脚本可以更清楚地说明这一点。 – Aaronaught 2010-04-15 03:44:04

回答

5

可能在会话中发生了什么?

尝试它的下跌之前的表的生存确认:

IF object_id('tempdb..#Temp') is not null 
BEGIN 
    DROP TABLE #Temp 
END 
+0

我正在添加一些工具来尝试确定表是否真的消失了,但在此期间我看不到任何可能导致此问题的情况。除了我所描述的内容之外,在会话中没有发生SQL,并且我没有从其他语句中得到任何错误 – StarBright 2010-04-15 03:40:08

2

我觉得你是不是在创建表可言,因为语句

CREATE TABLE #Temp ([Id] AS int) 

不正确。请把它写成

CREATE TABLE #Temp ([Id] int) 

看看它是否有效。

+0

对不起,我改变了表名以保护无辜者,并且我输入了错误...实际的表定义在语义上是正确的,我将更新 – StarBright 2010-04-15 03:37:50

6

我SQL Server 2005上进行了测试,您可以在创建它的事务删除临时表:

begin transaction 
create table #temp (id int) 
drop table #temp 
commit transaction 

的SQL Server版本您使用的?

您可能会重新考虑为什么要放弃临时表。连接结束后,本地临时表会自动删除。通常不需要明确地放弃它。

全局临时表以双重散列开头(f.e. ##MyTable。)但是即使全局临时表在没有连接引用时也会自动删除。

+2

+1这个问题“为什么删除临时表” – 2010-04-15 13:58:56

2
BEGIN TRAN 

IF object_id('DATABASE_NAME..#TABLE_NAME') is not null 
BEGIN 
    DROP TABLE #TABLE_NAME 
END 

COMMIT TRAN 

注:请输入你的表名,其中TABLE_NAME和数据库名称,它说DATABASE_NAME