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