回收临时表名称

时间:2016-06-29 21:16:08

标签: sql sql-server tsql

我有以下代码。

If OBJECT_ID('tempdb.dbo.#tempTable', 'U') is not null
drop table #tempTable;

select 'bacon' into #tempTable
select * from #tempTable

If OBJECT_ID('tempdb.dbo.#tempTable', 'U') is not null
drop table #tempTable;

select 'sandwich' into #tempTable
select * from #tempTable
  1. 删除临时表(如果存在)
  2. 使用select into语句
  3. 创建/填充它
  4. 删除临时表(如果存在)
  5. 使用select into语句
  6. 创建/填充它

    这是我阅读我编写的代码的方式,但我认为SSMS的阅读方式不同,因为我收到错误消息:

      

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

    我觉得If Object_ID部分可能会被提升到代码顶部,或者执行顺序。该表不会在第二个drop table语句中被删除。我当然可以使用不同的临时表作为解决方法,但我想理解为什么这个例子不起作用。

1 个答案:

答案 0 :(得分:1)

我的假设是它认为临时表仍然是批处理的一部分。

If OBJECT_ID('tempdb.dbo.#tempTable', 'U') is not null
drop table #tempTable;

select 'bacon' into #tempTable
select * from #tempTable

If OBJECT_ID('tempdb.dbo.#tempTable', 'U') is not null
drop table #tempTable;

GO --At least this should do the trick

select 'sandwich' into #tempTable
select * from #tempTable

虽然微软建议"DROP TABLE and CREATE TABLE should not be executed on the same table in the same batch. Otherwise an unexpected error may occur."

另请注意,如果您在带变量的存储过程中使用此变量,则在GO之后变量将不再存在。