临时表的DROP TABLE失败

时间:2010-04-15 01:13:46

标签: sql-server temp-tables sql-drop

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

的伪代码:

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',因为它不存在或您没有权限。

我无法想象如果没有先发生其他事情就会发生这种失败,但在此之前我没有看到任何其他失败。

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

4 个答案:

答案 0 :(得分:7)

可能会在会话中发生什么事情?

在删除之前尝试检查表的存在:

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

答案 1 :(得分:7)

我在SQL Server 2005上测试了这个,你可以在创建它的事务中删除一个临时表:

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

您使用的是哪个版本的SQL Server?

您可能会重新考虑为什么要删除临时表。连接结束时,将自动删除本地临时表。通常没有必要明确删除它。

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

答案 2 :(得分:2)

我认为你根本就没有创建表,因为声明

CREATE TABLE #Temp ([Id] AS int)

不正确。请把它写成

CREATE TABLE #Temp ([Id] int)

看看它是否有效。

答案 3 :(得分: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