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

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

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

4

4 回答 4

9

可能在两者之间的会话中发生了什么?

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

IF object_id('tempdb..#Temp') is not null
BEGIN
   DROP TABLE #Temp
END
于 2010-04-15T01:26:18.703 回答
7

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

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

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

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

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

于 2010-04-15T05:29:51.657 回答
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

于 2014-05-17T05:34:49.130 回答
2

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

CREATE TABLE #Temp ([Id] AS int)

是不正确的。请写成

CREATE TABLE #Temp ([Id] int)

看看它是否有效。

于 2010-04-15T01:33:15.377 回答