我在SQL Server 2000上有一个存储过程。它包含:
select ... into ##Temp ...
...
drop table ##Temp
当我第二次使用ADO运行存储过程时,它会提示:
数据库中已有一个名为“## Temp”的对象。
有人可以告诉我出了什么问题吗?
答案 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