我在 SQL Server 2000 上有一个存储过程,它包含以下内容:
select ... into ##Temp ...
...
drop table ##Temp
当我用 ADO 运行这个存储过程第二次时,它会提示:
数据库中已经存在名为 '##Temp' 的对象。
请问这是什么问题?
我在 SQL Server 2000 上有一个存储过程,它包含以下内容:
select ... into ##Temp ...
...
drop table ##Temp
当我用 ADO 运行这个存储过程第二次时,它会提示:
数据库中已经存在名为 '##Temp' 的对象。
请问这是什么问题?
你应该重写存储过程,如果存在临时表,则删除它,这样就永远不会遇到这个问题。
IF (SELECT object_id('TempDB..##Temp')) IS NOT NULL
BEGIN
DROP TABLE ##Temp
END
您正在使用全局临时表,这是由表名开头的 ## 标识的。这意味着多个会话可以访问该表。
很可能您有一个打开连接创建了该表,但未能删除它。您确定第一个 ADO 运行实际删除了该表吗?可能失败了,或者过程中的流程控制跳过了删除语句吗?
您可能需要在 SQL Server Enterprise Manager 中测试该过程,以查看是否报告任何错误。
由于您选择使用全局临时表##Temp
,因此它在任何给定时间都对所有SQL连接可见。显然,在一个连接的存储过程运行时,第二个连接进来并尝试创建另一个##Temp
,但已经存在....
改用连接本地的#Temp
表(只有一个#
)。
Private DBCon As New Connection
,这是我创建的。 - phoenies哦,这都是我的错。我不小心通过一个连接调用了SP两次。
这就是为什么第二次调用它时总是报错的原因。
当然,你读完我的描述也不会知道这一点。对不起,大家……
对我来说,这个解决方案有效:
IF (SELECT object_id ='#Temp') IS NOT NULL
BEGIN
DROP TABLE #Temp
END
object_id
是一个函数。应该写成object_id('#temp')
。 - Dave R.