临时表的 DROP TABLE 失败

问题描述 投票:0回答:5

我有一个客户端应用程序,它创建一个临时表,对临时表执行批量插入,然后在删除该表之前使用该表执行一些 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”,因为它不存在或您没有权限。

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

我是否遗漏了什么可能导致这种情况发生?

sql-server temp-tables sql-drop
5个回答
9
投票

可能在会议期间发生了一些事情?

尝试在删除表之前检查该表是否存在:

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

7
投票

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

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

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

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

全局临时表以双散列开头(例如

##MyTable
。)但即使是全局临时表,当没有连接引用它时也会自动删除。


2
投票

我认为你根本没有创建表,因为语句

CREATE TABLE #Temp ([Id] AS int)

不正确。请写为

CREATE TABLE #Temp ([Id] int)

看看它是否有效。


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

处输入数据库名称

0
投票

多年后没有一个明确的答案:您一定在创建或删除表的两行之一中写错了表的名称。

当然,您在发布之前已经更改了表的名称。这就是为什么这里没有人可以帮助你。

#Temp
可能类似于
#mylongtmptablename
。您可能会拥有
#mylongtablename

我说得这么清楚,因为它发生在我身上,我一次又一次地尝试,甚至在第二次看到这个名字时都认为这个名字是正确的,但事实并非如此。

© www.soinside.com 2019 - 2024. All rights reserved.