Chr*_*ris 4 sql t-sql 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
Run Code Online (Sandbox Code Playgroud)
消息2714,级别16,状态1,行179数据库中已存在名为"#temp"的对象.消息2714,级别16,状态1,行181数据库中已存在名为"#temp"的对象.消息2714,级别16,状态1,行183数据库中已存在名为"#temp"的对象.
我确定IF语句基于@indexName变量工作(用简单的东西替换block语句(例如,'select @indexName'),程序运行正常).
有关导致此错误的原因的任何想法?
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
Run Code Online (Sandbox Code Playgroud)
该where 1=2
零个记录创建表结构......然后if语句填充临时表.
干杯!
因为只有前几条记录存在差异。你可以试试这个
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
Run Code Online (Sandbox Code Playgroud)