使用IF / ELSE IF语句的奇数错误

时间:2012-06-28 23:53:18

标签: sql tsql sql-server-2008-r2

我正在尝试根据scenario参数的值创建一个临时表,并使用以下IF语句但是得到以下错误:

    IF @indexName = 'A'
        begin select top 400 * into #temp from #pretemp order by EMRev desc end
    ELSE IF @indexName = 'B'
        begin select top 75 * into #temp from #pretemp order by EMRev desc end
    ELSE IF @indexName = 'C'
        begin select top 300 * into #temp from #pretemp order by EMRev desc end
    ELSE 
        begin select top 100 * into #temp from #pretemp order by EMRev desc end
  

Msg 2714,Level 16,State 1,Lines 179   数据库中已经有一个名为“#temp”的对象。   消息2714,第16级,状态1,第181行   数据库中已经有一个名为“#temp”的对象。   消息2714,第16级,状态1,第183行   数据库中已经有一个名为“#temp”的对象。

我确定IF语句基于@indexName变量工作(用简单的东西替换block语句(例如'select @indexName'),程序运行正常)。

有关导致此错误的原因的任何想法?

2 个答案:

答案 0 :(得分:9)

SQL解析器查找可能创建临时表的所有位置,并且仅允许一次使用给定的临时表名称。解决方案是做这样的事情:

select * into #temp from #pretemp where 1=2

IF @indexName = 'A'
    begin insert into #temp select top 400 * from #pretemp order by EMRev desc end
ELSE IF @indexName = 'B'
    begin insert into #temp select top 75 * from #pretemp order by EMRev desc end
ELSE IF @indexName = 'C'
    begin insert into #temp select top 300 * from #pretemp order by EMRev desc end
ELSE 
    begin insert into #temp select top 100 * from #pretemp order by EMRev desc end

where 1=2创建没有记录的表结构......然后if语句填充临时表。

干杯!

答案 1 :(得分:3)

由于只有最大数量的记录不同。你可以试试这个

declare @num int 

SET @num = CASE @indexName 
                    WHEN 'A' THEN 400
                    WHEN 'B' THEN 75
                    WHEN 'C' THEN 300
                    ELSE  100
            END

select top (@num) * into #temp from #pretemp order by EMRev desc