2010-04-15 111 views
5

我有一個客戶端應用程序,它創建一個臨時表,在臨時表中執行批量插入,然後在刪除它之前使用該表執行一些SQL。DROP TABLE失敗的臨時表

僞代碼:

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

一項建議,將創建,批量插入,以及拖放事務塊之外聲明。沒有理由或需要鎖定它,因爲沒有其他連接可以訪問它。 – 2010-04-15 02:58:26

+0

@Philip凱利:這不是一個壞主意,我會看看我能做到這一點,以限制交易的長度,但我不能看到如何將導致此問題 – StarBright 2010-04-15 03:41:05

+0

的錯誤出現在空白要表現。 ;)一個完整的repro腳本可以更清楚地說明這一點。 – Aaronaught 2010-04-15 03:44:04

回答

5

可能在會話中發生了什麼?

嘗試它的下跌之前的表的生存確認:

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

我正在添加一些工具來嘗試確定表是否真的消失了,但在此期間我看不到任何可能導致此問題的情況。除了我所描述的內容之外,在會話中沒有發生SQL,並且我沒有從其他語句中得到任何錯誤 – StarBright 2010-04-15 03:40:08

2

我覺得你是不是在創建表可言,因爲語句

CREATE TABLE #Temp ([Id] AS int) 

不正確。請把它寫成

CREATE TABLE #Temp ([Id] int) 

看看它是否有效。

+0

對不起,我改變了表名以保護無辜者,並且我輸入了錯誤...實際的表定義在語義上是正確的,我將更新 – StarBright 2010-04-15 03:37:50

6

我SQL Server 2005上進行了測試,您可以在創建它的事務刪除臨時表:

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

的SQL Server版本您使用的?

您可能會重新考慮爲什麼要放棄臨時表。連接結束後,本地臨時表會自動刪除。通常不需要明確地放棄它。

全局臨時表以雙重散列開頭(f.e. ##MyTable。)但是即使全局臨時表在沒有連接引用時也會自動刪除。

+2

+1這個問題「爲什麼刪除臨時表」 – 2010-04-15 13:58:56

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