放弃后可以重新创建临时表吗?

时间:2012-03-21 20:27:41

标签: sql-server stored-procedures temp-tables

假设:

存储过程中的代码:

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等。有没有办法解决这个问题?每次只使用一个临时表会很不错。

如果没有,这是什么原因?

3 个答案:

答案 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