我有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
错误是<在数据库中已经有一个名为'## Temp'的对象>因此,
是的,如果已经有一个名为## Temp的对象,则需要删除原始对象以创建一个新对象... – 2010-08-13 11:34:56
只是出于好奇,此代码是否仅适用于SQL-Server 2000?尝试在SQL Server 2008中,并得到一个错误:'不能删除表'#jobsconsumed',因为它不存在或你没有权限。' – whatwhatwhat 2016-08-05 11:48:42
您正在使用全局临时表,如表名开头的##所示。这意味着多个会话可以访问该表。
您可能已打开一个连接来创建表,但未能放弃它。你确定第一个ADO运行实际上放弃了桌子吗?它可能失败了,或者程序中的流程控制跳过了drop语句吗?
您可能想要测试SQL Server企业管理器中的过程以查看它是否报告任何错误。
由于您选择使用全局临时表##Temp
,因此在任何给定时间,所有SQL连接都可以看到它。很明显,而存储过程运行的一个连接,第二连接进来,试图创建另一个##Temp
但已经存在....
使用连接本地#Temp
表(只有一个#
)来代替。
Erm ...但我确定只有一个连接'Private DBCon As New Connection',我创建了。 – phoenies 2010-08-13 05:28:26
仅当使用一个'#'时,该错误也会出现。 – whatwhatwhat 2016-08-04 17:23:25
哦,这都是我的错。我错误地通过一个连接向SP调用了两次SP。
这就是为什么当第二次被调用时它总是报告错误。
当然,你不会通过阅读我的描述知道。对不起球员...
对我来说,这个解决方案的工作原理:
IF (SELECT object_id ='#Temp') IS NOT NULL
BEGIN
DROP TABLE #Temp
END
这不起作用。 'object_id'是一个函数。它应该是'object_id('#temp')' – 2017-01-12 15:42:39
你不能只使用表变量(select .. into @temp)。那么你不必担心释放表,等等。 – RPM1984 2010-08-13 05:22:09
表结构是动态的。这就是我使用临时表的原因。 – phoenies 2010-08-13 06:15:54