数据库中已经有一个名为“## Temp”的对象

时间:2010-08-13 05:08:03

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

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

当我第二次使用ADO运行存储过程时,它会提示:
数据库中已有一个名为“## Temp”的对象。
有人可以告诉我出了什么问题吗?

5 个答案:

答案 0 :(得分:23)

您应该重新编写存储过程以删除临时表(如果存在),那么您将不会遇到此问题

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

答案 1 :(得分:1)

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

使用连接本地#Temp表(仅一个#)。

答案 2 :(得分:1)

哦,这都是我的错。我错误地通过一个连接两次打电话给SP 这就是为什么它在第二次被叫时总是会报错 当然,通过阅读我的描述你不会知道。对不起伙计......

答案 3 :(得分:0)

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

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

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

答案 4 :(得分:0)

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

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