7

我正在尝试根据场景参数的值创建一个临时表,并使用以下 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

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

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

关于导致此错误的任何想法?

4

2 回答 2

12

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 语句填充临时表。

干杯!

于 2012-06-28T23:58:39.797 回答
4

因为只有最高数量的记录是不同的。你可以试试这个

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
于 2012-06-29T13:13:24.357 回答