为什么 DROP TABLE 在 SELECT INTO 之前似乎没有生效?

Why DROP TABLE doesn't seem to take effect before a SELECT INTO?

下面的 tSQL 查询让我感到困惑:

select 1 as FIELD into #TEMP
drop table #TEMP
select 1 as FIELD into #TEMP

当我从 SQL Server Management Studio 会话 window 运行 它时(按 F5 到整个查询,作为一个组) ,我收到以下错误:

Msg 2714, Level 16, State 1, Line 3
There is already an object named '#TEMP' in the database.

请注意,在执行查询之前 table #TEMP 不存在。

我认为代码不应产生任何错误,因为第 2 行正在删除临时 table。但是执行到第3行好像drop没有生效

我的问题:

  1. 为什么会出现错误?
  2. 如何修复查询以使其按预期执行?

PS。上面的查询是我的一个现实世界查询的简化,它显示出相同的症状。

PS2。不管这是否是一种合理的编程实践(正如 Sean 在他的评论中所暗示的那样),这种意想不到的行为促使我寻找有关如何解析这些查询的信息,希望这些知识对我将来有所帮助。

在这里试试这个:

select 1 as FIELD into #TEMP
drop table #TEMP
GO
select 1 as FIELD into #TEMP

我发现现有表的查找方式不同:

select 1 as FIELD into #TEMP
drop table #TEMP

当您在这些命令后使用 into 语句时:

select 1 as FIELD into #TEMP

错误是:

There is already an object named '#TEMP' in the database.

并且当您在 #TEMP 上使用 select 后这些命令时:

select * from #TEMP

错误是:

Invalid object name '#TEMP'.

所以,在第一种情况下,有一个名称为 #TEMP 的对象,在另一种情况下,没有一个名称为 #TEMP 的对象!

technet.microsoft 的重要说明是:

DROP TABLE and CREATE TABLE should not be executed on the same table in the same batch. Otherwise an unexpected error may occur.


在 SQL 服务器数据库引擎删除表的注释中:

The SQL Server Database Engine defers the actual page deallocations, and their associated locks, until after a transaction commits.

所以使用 select 语句的第二个错误可能与 实际页面释放有关 而使用 into 语句的第一个错误可能与 从关联锁到事务提交之间的持续时间