假设:
存储过程中的代码:
select bleh
into #tblTemp
from FunctionThatReturnsTable('some','params')
-- do some stuff
drop table #tblTemp
-- Error on this command:
-- 'There is already an object named '#tblTemp' in the database.'
select bleh
into #tblTemp
from FunctionThatReturnsTable('some','other params')
问题:
我无法重新创建此临时表。我的工作是使用#tmpTable1,#tmpTable2,#tempTable3等。有没有办法解决这个问题?每次只使用一个临时表会很不错。
如果没有,这是什么原因?
答案 0 :(得分:11)
正如我的评论所反映的那样,我建议答案是你为你创建的每个对象使用不同的#temp表名。这有点像对医生说,“当我这样做时会疼。”他可能会做出反应,“停止这样做!”
这是一个问题的原因是SQL Server的解析器尝试一次性解析整个批处理。它可以清楚地看到你试图多次创建相同的#temp表,但是忽略了它们之间的DROP
命令(我无法确切地告诉你为什么会这样,因为我无法访问源代码)。这与你不能这样做的原因相同:
IF (1=1)
CREATE TABLE #foo(i INT);
ELSE
CREATE TABLE #foo(i VARCHAR(32));
解析器看到两个相同的名称,但不能真正遵循IF/ELSE
逻辑。
除了避免多个同名的#temp表导致解析器出现问题之外,使用唯一名称的另一个好处是,如果不明确删除它们,可以重复使用。这将减轻tempdb在元数据/锁定方面的负担。
答案 1 :(得分:0)
我遇到了删除+插入列的问题。问题可能在于解析器,它在第一次创建时“识别”该表,并且看不到它已被删除。
我建议使用exec sp_executesql 'create table'
答案 2 :(得分:0)
这是一项功能,Microsoft已针对Microsoft Connect Bug ID 666430
进行了澄清请参阅相同的案例研究 temporary-table-could-not-be-re-created