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 临时名称是在运行时使用格式创建的,#[WSID]TEMP[NOW]并被截断为 116 个字符,例如:TEMPTABLE=#LOKSPEC1TEMP141031155408

此外,我尝试使用单引号或双引号转义表名,但结果始终相同(它不会丢失)。我发现方括号会引发语法错误。

4

3 回答 3

2

将您的临时表删除查询更改为此

 CommandText = "IF OBJECT_ID('tempdb.." & TEMPTABLE & "') IS NOT NULL DROP TABLE " & TEMPTABLE
于 2014-10-31T20:27:34.743 回答
2

Sql 在与当前工作数据库完全不同的地方创建以井号开头的表。因此,如果要查询临时表的模式信息,则需要显式引用该其他数据库。如果您像这样调整代码可能更容易查看

.CommandText = "IF OBJECT_ID('tempdb.." & TEMPTABLE & "') IS NOT NULL DROP TABLE " & TEMPTABLE
于 2014-10-31T20:27:39.387 回答
0

我还发现了另一种通过查看相同tempdb位置的方法。

.CommandText = "IF EXISTS (SELECT * FROM TEMPDB.SYS.TABLES WHERE NAME LIKE '" & TEMPTABLE & "%') DROP TABLE " & TEMPTABLE
.Execute
于 2014-10-31T20:33:51.930 回答