【问题标题】:There is already an object named '##Temp' in the database数据库中已经有一个名为“##Temp”的对象
【发布时间】:2011-03-29 07:01:18
【问题描述】:

我在 SQL Server 2000 上有一个存储过程。它包含:
select ... into ##Temp ...
...
drop table ##Temp

当我第二次使用ADO运行存储过程时,它提示:
数据库中已经有一个名为'##Temp'的对象。
谁能告诉我怎么了?

【问题讨论】:

  • 你能不能只使用一个表变量(选择..进入@temp)。那么您不必担心释放表等
  • 表结构是动态的。这就是我使用临时表的原因。

标签: sql sql-server sql-server-2000 ado temp-tables


【解决方案1】:

如果临时表存在,你应该重写你的存储过程来删除临时表,那么你就不会遇到这个问题

IF (SELECT object_id('TempDB..##Temp')) IS NOT NULL
BEGIN
    DROP TABLE ##Temp
END

【讨论】:

  • 错误是所以问题在
  • 是的,如果已经有一个名为 ##Temp 的对象,您需要删除原始对象才能创建一个新对象...
  • 只是出于好奇,此代码是否仅适用于 SQL-Server 2000?在 SQL-Server 2008 中尝试过,但出现错误:Cannot drop the table '#jobsconsumed', because it does not exist or you do not have permission.
  • 我已经让 object_id 测试在脚本范围的上下文中运行时失败,并且在您突出显示然后执行所有代码时通过。 IS_OBJECT 似乎不是易变的;它似乎在脚本执行开始时记录状态,并且在您突出显示然后执行时以不同的方式记录状态。
【解决方案2】:

您正在使用全局临时表,如表名开头的 ## 所示。这意味着多个会话可以访问该表。

您可能打开了一个创建表的连接,但未能删除它。您确定第一次 ADO 运行实际上删除了表。可能是失败了,还是过程中的流控制跳过了 drop 语句?

您可能希望在 SQL Server 企业管理器中测试该过程以查看它是否报告任何错误。

【讨论】:

  • 我也不能从查询分析器中删除它。也许前几次失败了。我会看到的。
  • 是的,我应该提到只有创建连接才能删除它。您可以运行 SP_WHO2 以查看是否有其他可能是所有者的连接。不幸的是,它不会告诉您哪个连接拥有该文件。祝你好运。
【解决方案3】:

由于您选择使用全局临时表##Temp,它在任何给定时间对所有 SQL 连接都是可见的。显然,当存储过程为一个连接运行时,第二个连接进入并尝试创建另一个##Temp,但它已经存在......

改用连接本地#Temp 表(只有一个#)。

【讨论】:

  • Erm...但我确定只有一个连接 Private DBCon As New Connection,这是我创建的。
【解决方案4】:

哦,都是我的错。我通过一个连接错误地调用了 SP 两次。
这就是为什么它在第二次调用时总是报错。
当然,看我的描述你不会知道的。对不起各位...

【讨论】:

    【解决方案5】:

    对我来说,这个解决方案有效:

    IF (SELECT object_id ='#Temp') IS NOT NULL
    BEGIN
       DROP TABLE #Temp
    END
    

    【讨论】:

    • 那行不通。 object_id 是一个函数。应该是object_id('#temp')
    猜你喜欢
    • 2021-09-24
    • 2019-09-18
    • 2019-05-12
    • 2016-04-08
    • 2014-08-01
    • 2010-11-12
    • 2021-05-10
    • 2013-10-21
    • 1970-01-01
    相关资源
    最近更新 更多