临时表不会删除[重复]

Posted

技术标签:

【中文标题】临时表不会删除[重复]【英文标题】:Temporary table will not drop [duplicate] 【发布时间】:2014-10-31 20:07:23 【问题描述】:

下面代码中的条件放置表行似乎不起作用。它执行没有错误,但是下一行错误表明对象 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

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

【问题讨论】:

显然,由于您的问题被标记为重复,我无法添加答案,但简单的答案是您正在尝试删除会话本地临时表(一个 #-prefix,例如 # tmp),而不是全局临时表(两个#-前缀,例如##tmp),这是两个完全不同的东西。 【参考方案1】:

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

是的,这个很有趣,因为那里有通配符。像这样的临时表是特定于会话的。另一个用户可能会出现并创建一个名称与您类似的临时表,并且 SQL 通过附加一大堆其他垃圾来避免名称冲突,这些垃圾使这两个表保持唯一并稍微限定它们。可以想象,此查询可能会返回与您的表类似但在不同会话中创建的表的 id。这不太可能,但如果真的发生了,要弄清楚发生了什么几乎是不可能的。

以上是关于临时表不会删除[重复]的主要内容,如果未能解决你的问题,请参考以下文章

查询删除临时表中的重复行

如何删除没有临时表的 MySQL 表中的所有重复记录

mysql如何创建临时表

Mysql临时表用法

临时表,临时表什么时候删除

mysql删除重复记录,保存Id最小的一条