【问题标题】:ERROR: There is already an object named '#temp' in the database [duplicate]错误:数据库中已经有一个名为“#temp”的对象[重复]
【发布时间】:2021-09-24 12:03:02
【问题描述】:

我想在存储过程中包含与以下代码类似的代码。但是当我执行它时,我得到了这个错误:

数据库中已经有一个名为“#temptable”的对象。

代码:

IF 1=1
    SELECT
        [col1] = 'inside IF 1',
        [col2] = 'inside IF 2'
    INTO
        #temptable
ELSE
    SELECT
        [col1] = 'inside Else 1',
        [col2] = 'inside Else 2',
        [col3] = 'inside Else 3'
    INTO
        #temptable

有没有办法解决这个问题?请注意ELSE 块有 3 列,而IF 块有 2 列进入#temptable

【问题讨论】:

  • 创建一次表并为第一个分支分配NULL值。

标签: sql sql-server tsql ssms


【解决方案1】:

这是一个解析错误。您试图在同一批次中创建两次相同的对象。没关系,后者永远无法运行,该语句将失败,因为解析器看到您尝试创建 #temptable 两次。

【讨论】:

    【解决方案2】:

    就像 Larnu 已经说过的,这是一个解析错误。它看到您尝试多次创建同一个表,但不知道只能访问其中一个。

    根据这个临时表的使用方式,可能有更好的方法来重构代码,但从提供的内容出发,您有几个选择:

    1. 使用动态查询对解析器隐藏 SQL。动态查询通常不受欢迎,应尽可能避免。 (已更新为使用全局临时表来解决范围问题)
    IF 1=1
      EXEC('SELECT
        [col1] = ''inside IF 1'',
        [col2] = ''inside IF 2''
      INTO
        ##temptable')
    ELSE
      EXEC('SELECT
        [col1] = ''inside Else 1'',
        [col2] = ''inside Else 2'',
        [col3] = ''inside Else 3''
      INTO
        ##temptable')
    
    1. 如果您提前知道所有列名,那么您可以CREATE #temptable 与所有可能的列一起使用,并且在您的条件逻辑中,您可以使用 ALTER TABLE 删除未使用的列。
    CREATE TABLE #temptable (
        col1    varchar(10),
        col2    varchar(10),
        col3    varchar(10)
    )
    
    IF  1 = 1
    BEGIN
        INSERT  INTO #temptable (col1, col2)
        SELECT
            col1 = 'inside IF 1',
            col2 = 'inside IF 2'
    
        ALTER TABLE #temptable DROP COLUMN col3
    END
    ELSE
    BEGIN
        INSERT  INTO #temptable (col1, col2, col3)
        SELECT
            col1    = 'inside Else 1',
            col2    = 'inside Else 2',
            col3    = 'inside Else 3'
    END
    

    【讨论】:

    • 选项 1 不会像您预期的那样工作。它会解析,是的,但是一旦您尝试在动态语句范围之外引用对象#temptable,查询就会失败;因为该表已被隐式删除。
    • 对。我很少使用临时表,忘记了 # 是本地的,而 ## 是全局的。我已经更新了答案。这些选项都不是可取的。几乎可以肯定有一种方法可以将其重构为不需要具有两种不同模式的临时表。
    猜你喜欢
    • 2011-03-29
    • 1970-01-01
    • 2019-09-18
    • 2019-05-12
    • 1970-01-01
    • 2016-04-08
    • 2014-08-01
    • 2010-11-12
    • 2021-05-10
    相关资源
    最近更新 更多