代码之家  ›  专栏  ›  技术社区  ›  JeffO

在if/else块中分隔时存在T-SQL错误对象

  •  0
  • JeffO  · 技术社区  · 16 年前

    我得到错误:Msg 2714,16级,状态1,第16行 数据库中已存在名为“#mytentable”的对象。

    这是有办法的,但想知道为什么会这样。似乎SQL Server正在验证if/else语句的两个块?

    declare @choice int
    select @choice = 1
    
    if @choice = 1
        begin
            select 'MyValue = 1' AS Pick into #my_temp_table
        end
    else
        begin
            select 'MyValue <> 1' AS Pick into #my_temp_table
        end
    
    select * from #my_temp_table
    
    drop table #my_temp_table
    

    如果表有不同的名称,它就可以工作。或者如果我创建临时表并使用Insert Into。。。同样有效的语句。

    2 回复  |  直到 16 年前
        1
  •  4
  •   SQLMenace    16 年前

    请看这里: What is deferred name resolution and why do you need to care?

    基本上你得先把桌子擦干净

    因此,从SQLServer7开始,对实际表启用了延迟名称解析,但对临时表没有启用。如果将代码更改为使用实表而不是临时表,则不会有任何问题

    这是另一种方法

     declare @choice int
        select @choice = 1
    
    declare @Value varchar(100)
     if @choice = 1
     select @Value = 'MyValue = 1'
     else
     select @Value = 'MyValue <> 1'
    
        select @Value AS Pick into #my_temp_table
        select * from #my_temp_table
    
        drop table #my_temp_table
    
        2
  •  1
  •   Jon    16 年前

        declare @choice int
        select @choice = 1
    
    CREATE TABLE     #my_temp_table(
    Pick varchar(25)
    )
    
    
        if @choice = 1
            begin
                INSERT INTO #my_temp_table 
                  select 'MyValue = 1'
            end
        else
            begin
                INSERT INTO #my_temp_table 
                    select 'MyValue <> 1'
            end
    
        select * from #temptable
    
        drop table #temptable
    

    编辑 抱歉,我看到你试过这个,问题是为什么会这样。这是因为SQLServer在创建存储过程时会对其进行解析,并检查命名冲突。

    推荐文章