我正在尝试根据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'),程序运行正常)。
有关导致此错误的原因的任何想法?
答案 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