我有一个客户端应用程序,它创建一个临时表,对临时表执行批量插入,然后在删除该表之前使用该表执行一些 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”,因为它不存在或您没有权限。
我无法想象如果不先发生其他事情,如何会发生这种故障,但我没有看到在此之前发生任何其他故障。
我是否遗漏了什么可能导致这种情况发生?
可能在会议期间发生了一些事情?
尝试在删除表之前检查该表是否存在:
IF object_id('tempdb..#Temp') is not null
BEGIN
DROP TABLE #Temp
END
我已经在 SQL Server 2005 上对此进行了测试,您可以在创建它的事务中删除临时表:
begin transaction
create table #temp (id int)
drop table #temp
commit transaction
您使用的是哪个版本的 SQL Server?
您可能会重新考虑为什么要删除临时表。当连接结束时,本地临时表会自动删除。通常不需要明确删除它。
全局临时表以双散列开头(例如
##MyTable
。)但即使是全局临时表,当没有连接引用它时也会自动删除。
我认为你根本没有创建表,因为语句
CREATE TABLE #Temp ([Id] AS int)
不正确。请写为
CREATE TABLE #Temp ([Id] int)
看看它是否有效。
BEGIN TRAN
IF object_id('DATABASE_NAME..#TABLE_NAME') is not null
BEGIN
DROP TABLE #TABLE_NAME
END
COMMIT TRAN
注意:请在
TABLE_NAME
处输入您的表名称,在 DATABASE_NAME
处输入数据库名称
多年后没有一个明确的答案:您一定在创建或删除表的两行之一中写错了表的名称。
当然,您在发布之前已经更改了表的名称。这就是为什么这里没有人可以帮助你。
#Temp
可能类似于 #mylongtmptablename
。您可能会拥有 #mylongtablename
。
我说得这么清楚,因为它发生在我身上,我一次又一次地尝试,甚至在第二次看到这个名字时都认为这个名字是正确的,但事实并非如此。