-2

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

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
4

2 回答 2

4

请参阅文档,其中指出:

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

您的代码产生以下错误:

消息 2714,级别 16,状态 1,第 11 行
数据库中已经有一个名为“#temp”的对象。

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

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

于 2013-09-13T01:58:15.973 回答
1

这是一项设计功能,Microsoft 针对 Microsoft Connect BugID 666430 进行了澄清

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

于 2014-01-24T16:09:09.217 回答