2014-10-31 86 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