无法在同一批次中两次创建相同的#temp表

时间:2013-09-13 01:01:57

标签: sql-server temp-tables

在SQL Server中写了一个非常简单的测试用例,并且不太明白为什么它不起作用:

create table #temp(
  id int,
  val int)

insert into #temp values (1, 1), (2, 2)
select * from #temp

if object_id('tempdb..#temp') is not null
   drop table #temp

create table #temp(
  id int,
  val int)

insert into #temp values (1, 1), (2, 2)
select * from #temp

2 个答案:

答案 0 :(得分:4)

请参阅the documentation,其中说明:

  

如果在单个存储过程或批处理中创建了多个临时表,则它们必须具有不同的名称。

您的代码会产生以下错误:

  

Msg 2714,Level 16,State 1,Line 11   
数据库中已经有一个名为'#temp'的对象。

这不是因为该表已被删除而无法重新创建;这段代码永远不会被执行,解析器实际上会看到你试图创建两次相同的表(并且它无法看到像你的DROP命令那样的逻辑)。

除了使用两个不同的#temp表名之外,另一种解决方法是只创建一次表,并在完成第一段代码后截断它。

答案 1 :(得分:1)

这是一项功能,Microsoft已针对Microsoft Connect BugID 666430

进行了澄清

关于同一问题的案例研究见temporary-table-could-not-be-re-created