代码之家  ›  专栏  ›  技术社区  ›  Ricardo C. zero

为什么在SELECT INTO之前DROP TABLE似乎不会生效?

  •  6
  • Ricardo C. zero  · 技术社区  · 11 年前

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

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

    当我从SQL Server Management Studio会话窗口运行它时(按 第5页 对于整个查询(作为一个组),我得到以下错误:

    消息2714,级别16,状态1,第3行
    数据库中已存在名为“#TEMP”的对象。

    注意,该表 #TEMP 在执行查询之前不存在。

    我认为代码不应该产生任何错误,因为第2行正在删除临时表。但当执行第3行时,就好像下降没有生效。

    我的问题:

    1. 为什么会发生错误?
    2. 如何修复查询,使其按预期执行?

    PS.上面的查询是我的真实世界查询的简化,它显示了相同的症状。

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

    2 回复  |  直到 11 年前
        1
  •  2
  •   shA.t Rami Jamleh    11 年前

    正如我所发现的,现有表格的查找不同:

    select 1 as FIELD into #TEMP
    drop table #TEMP
    

    当您使用 into 语句:

    select 1 as FIELD into #TEMP
    

    错误为:

    数据库中已存在名为“#TEMP”的对象。

    当您使用 select 在…上 #TEMP 在这些命令之后:

    select * from #TEMP
    

    错误为:

    对象名“#TEMP”无效。

    所以,在第一种情况下,有一个对象 #温度 在另一种情况下,没有对象 #温度 名称

    来自 technet.microsoft 是:

    不应在同一批处理中的同一表上执行DROP TABLE和CREATE TABLE。否则可能会发生意外错误。


    在SQL Server数据库引擎删除表的说明中:

    SQL Server数据库引擎将延迟实际的页面释放及其关联的锁,直到事务提交之后。

    所以使用时的第二个错误 选择 声明可能与 实际页面释放 以及使用时的第一个错误 进入 声明可能与 关联到事务提交的锁之间的持续时间 .

        2
  •  1
  •   Stephan    11 年前

    这里尝试一下:

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