我有一个创建临时表的客户端应用程序,在临时表中执行批量插入,然后在删除之前使用该表执行一些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',因为它不存在或您没有权限。
我无法想象如果没有先发生其他事情就会发生这种失败,但在此之前我没有看到任何其他失败。
我有什么遗漏可能会导致这种情况发生吗?
答案 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