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

时间:2010-04-08 14:37:21

标签: sql-server-2005 tsql

我收到错误:消息2714,级别16,状态1,行16 数据库中已经有一个名为“#mytemptable”的对象。

有很多方法,但想知道为什么会这样。好像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 个答案:

答案 0 :(得分:4)

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

基本上你需要先停止表格

所以发生的事情是从SQL Server 7开始,对真实表启用延迟名称解析,但不为临时表启用延迟名称解析。如果您更改代码以使用真实表而不是临时表,则不会有任何问题

这是另一种方式

 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

答案 1 :(得分:1)

试试这个:

    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

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