【问题标题】:There is already an object named '#xxxx' in the database数据库中已经有一个名为“#xxxx”的对象
【发布时间】:2016-06-22 20:49:25
【问题描述】:

我在一个脚本中多次删除/创建临时表

IF OBJECT_ID('tempdb..#uDims') IS NOT NULL
DROP TABLE #uDims

select * into #uDims from table1

.... do something else 

IF OBJECT_ID('tempdb..#uDims') IS NOT NULL
DROP TABLE #uDims

select * into #uDims from table2 -- >> I get error here

.... do something else 

IF OBJECT_ID('tempdb..#uDims') IS NOT NULL
DROP TABLE #uDims

select * into #uDims from table3  -- >> and here

.... do something else 

当尝试运行脚本时,我得到了

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

关于第二个和第三个“select into...”

这显然是编译时错误。如果我逐段运行脚本,一切都会顺利进行。

这个问题有很多解决方法,但我想知道为什么 SSMS 对此感到不安。

【问题讨论】:

  • 这是一个存储过程,所以没有GO。
  • This answer in dba.se 正确解释了问题

标签: sql-server ssms temp-tables


【解决方案1】:

Ivan Starostin 是正确的。我在我的 SQL 上测试了这个 TSQL,它工作正常。

IF OBJECT_ID('tempdb..#uDims') IS NOT NULL
DROP TABLE #uDims
select top 10 *  into #uDims from tblS
go 
IF OBJECT_ID('tempdb..#uDims') IS NOT NULL
DROP TABLE #uDims
select top 10 * into #uDims from Waters

没有 go 我得到和你一样的错误(FLICKER)。

【讨论】:

  • 但是操作说这是在存储过程中,所以他/她不能使用GO
  • 对,就像我提到的,它是一个存储过程。从逻辑和技术上讲,我的脚本没有任何问题。这只是 SSMS 问题。 SSMS 试图变得聪明,但这还不够,因为它没有看到我在 "select into..." 之前删除了表
  • @Flicker,您需要知道为什么会出错或如何规避它吗?
  • @IvanStarostin 最后一句话but I want to know why SSMS is upset on that.
  • 因为DDL without GO。与尝试在同一批次中更新刚刚创建的列相同。
【解决方案2】:

您不能在存储过程中多次创建同一个临时表。

根据documentation(在备注部分),

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

因此,您要么必须使用不同的临时表名称,要么必须在存储过程之外执行此操作并使用GO

【讨论】:

  • 虽然这是真的,但这不是这里的作用。示例:假设您导入数据并想将其重命名为临时表,然后检查它是否存在,最后给出微软非常特殊的智能感知所需的提示。所以你做 IF OBJECT_ID('tempdb.dbo.imported') IS NOT NULL BEGIN SELECT * INTO ##temptable FROM import DROP TABLE tempdb.dbo.imported END IF OBJECT_ID('##temptable') IS NULL RAISERROR('errmsg' , 20, -1) WITH LOG CREATE TABLE... 在这种情况下,您最多只创建了一次表,但 linter 仍然会阻止错误执行。
【解决方案3】:

对于脚本,正如其他人所说,使用GO 是解决方法。

但是,如果这实际上是存储过程中的代码,则会遇到不同的问题。不喜欢语法的不是 SSMS,而是 SQL 编译器。它看到并阻塞了这三个INSERT… INTO… 语句,并且不够聪明地意识到您正在创建语句之间删除表。 (即使你去掉IF 语句,你仍然会遇到问题。)

解决方法是使用不同的临时表名称。 (附带好处,因为临时表基于三个不同的表,这将有助于更清楚地表明表结构是不同的。)如果您担心内存中的空间过多,您仍然可以删除每个临时表重新完成它。

【讨论】:

    猜你喜欢
    • 2019-05-12
    • 2011-03-29
    • 2016-04-08
    • 2014-08-01
    • 2010-11-12
    • 2021-05-10
    • 2013-10-21
    • 1970-01-01
    • 2020-10-19
    相关资源
    最近更新 更多