临时表不会删除[重复]
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。这不太可能,但如果真的发生了,要弄清楚发生了什么几乎是不可能的。以上是关于临时表不会删除[重复]的主要内容,如果未能解决你的问题,请参考以下文章