2014-10-31 78 views
0

下面的代碼中的條件拖放錶行似乎不起作用。它執行時沒有錯誤,但是接下來的行錯誤說對象ID已經存在 - 所以它實際上並沒有丟掉表。臨時表不會丟棄

任何想法?

我使用ADO通過OLE DB(SQLOLEDB提供程序)連接到MS SQL Server 2005數據庫。

'Create a temporary table on the SQL Server and insert into it the info for the end part 
With ADOcmA 
    Set .ActiveConnection = mObjCON 
    .CommandType = adCmdText 
    .CommandText = "IF OBJECT_ID('" & TEMPTABLE & "') IS NOT NULL DROP TABLE " & TEMPTABLE 
    .Execute 
    .CommandText = "CREATE TABLE " & TEMPTABLE & " (ITEM VARCHAR(255),DESCRIP1 CHAR(255),DESCRIP2 CHAR(255), LEV INT, SEQ VARCHAR(255), FLAG1 TINYINT, PRIMARYKEY INT IDENTITY(1,1) PRIMARY KEY,QTY_PER FLOAT)" 
    .Execute 
    .CommandText = "Insert Into " & TEMPTABLE & " (ITEM,DESCRIP1,DESCRIP2,LEV,SEQ,FLAG1,QTY_PER) select item_no,Item_desc_1,Item_desc_2,1,1,'1',1 FROM " & cstrMACtItem & " WHERE Item_no ='" & strITEM & "' " 
    .Execute 
End With 

FWIW的不是Temptable名稱在運行時使用的格式#[WSID]TEMP[NOW]並截斷爲116個字符創建的,因此,例如:TEMPTABLE=#LOKSPEC1TEMP141031155408

而且,我試着用單引號或雙引號逃逸表名但總是相同的結果(它不會下降)。我發現方括號引發了一個語法錯誤。

+0

顯然,因爲你的問題被標記爲重複,我不能添加一個答案,但答案很簡單,你想刪除一個會話的本地臨時表(一個# - 前綴,如#tmp) ,而不是全局臨時表(兩個#前綴,例如## tmp),這是兩個完全不同的東西。 – 2015-12-28 15:40:44

回答

2

SQL創建表井號在一個整體的其他地方比你目前的工作數據庫作序。所以如果你想詢問臨時表的模式信息,那麼你需要明確地引用其他數據庫。如果您優化了你的代碼,這樣

.CommandText = "IF OBJECT_ID('tempdb.." & TEMPTABLE & "') IS NOT NULL DROP TABLE " & TEMPTABLE 
2

你的臨時表查詢滴更改此

CommandText = "IF OBJECT_ID('tempdb.." & TEMPTABLE & "') IS NOT NULL DROP TABLE " & TEMPTABLE 
0

我還發現另一種方法是通過尋找在同一個位置tempdb工作可能更容易看到。

.CommandText = "IF EXISTS (SELECT * FROM TEMPDB.SYS.TABLES WHERE NAME LIKE '" & TEMPTABLE & "%') DROP TABLE " & TEMPTABLE 
.Execute 
+2

是的,這個很有趣,因爲那裏有通配符。像這樣的臨時表是特定於會話的。另一個用戶可能會出現並創建一個類似你的名字的臨時表,並且SQL通過追加一大堆其他垃圾來避免名稱衝突,這些垃圾可以使兩個表保持唯一性並限定它們一點。可以想象,這個查詢可以爲類似於你的表格返回一個id,但是在不同的會話中創建。這不太可能發生,但如果它發生了什麼事情,那將是不可能的。 – Greenspark 2014-10-31 20:40:17