Sql server 临时表的删除表失败

Sql server 临时表的删除表失败,sql-server,temp-tables,sql-drop,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]=

我有一个客户端应用程序,它创建一个临时表,在临时表中执行大容量插入,然后在删除它之前使用该表执行一些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

我认为您根本没有创建表,因为

CREATE TABLE #Temp ([Id] AS int)
这是不正确的。请把它写成

CREATE TABLE #Temp ([Id] int)

并查看它是否有效。

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

begin transaction
create table #temp (id int)
drop table #temp
commit transaction
您使用的是哪个版本的SQL Server

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

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

BEGIN TRAN

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

COMMIT TRAN

注意:请在
table\u name
处输入您的表名,在显示
database\u name

的位置输入数据库名,然后将create、bulk insert和drop语句移到事务块之外。没有理由也不需要锁定它,因为没有其他连接可以访问它。@Philip Kelley:这不是一个坏主意,我会看看是否可以这样做来限制事务的长度,但我看不出这将如何导致这个问题。这个错误似乎在空白处显现出来。。)一个完整的复制脚本将对此有更多的了解。是的,它将使事务更短/更紧密,是的,这对您的问题没有影响。我站在Andomar一边:为什么要尝试删除临时表,因为当事务关闭时它无论如何都会被删除?实际使用该表的查询都没有失败,是吗?(是的,知道发生了什么是很好的,但正如所介绍的,它最终与您的流程无关。)有人真的发现了错误发生的原因吗?我在连接一个具有sysadmin的登录时遇到了相同的错误。所有那些说你不需要放下桌子的人都是毫无帮助的。事实上,该命令是有效的SQL,并且给定了一个有效的create table#Whatever(…),无论技术上是否需要将其放入,它都应该工作。如果问题是“我的内部联接出现语法错误”,那么答案是“你不必说‘内部’,你只需说‘联接’就行了”吗?正确但不相关,因为它应该再次工作,因此不会解决OPs问题。很抱歉造成混淆,我正在更改表名以保护无辜者,但我键入了错误的名称。。。实际的表定义在语义上是正确的,我将更新这个问题。我正在添加一些工具,试图确定表是否真的消失了,但在此期间,我看不到任何可能导致这种情况的原因。除了我所描述的以外,会话中没有发生SQL,并且我没有从其他语句中得到任何错误。数据库中已经有一个名为“#Temp”的对象。也就是说,解决方案不起作用