【问题标题】:Odd error using IF/ELSE IF statements使用 IF/ELSE IF 语句的奇怪错误
【发布时间】:2012-06-30 13:16:04
【问题描述】:

我正在尝试根据场景参数的值创建一个临时表,并使用以下 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'),程序运行良好)。

关于导致此错误的原因有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    因为只有前几条记录是不同的。你可以试试这个

    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
    

    【讨论】:

      【解决方案2】:

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

      干杯!

      【讨论】:

      • 优秀的解决方案。我不会想到这一点,并且会复制#pretemp 的定义,从而使#temp 在#pretemp 更改时需要更改(我猜这是在sproc 中)。这更容易并使意图(临时表具有相同的结构并且#temp 是一个子集)更加清晰。很不错。 :)
      • 非常好!我想出了一个几乎相同的解决方案。 :-) stackoverflow.com/questions/4245444/… IF .. ELSE .. CREATE TABLE #SomeTempTable 也会出现这个问题,我也提到了解决方案。
      猜你喜欢
      • 1970-01-01
      • 2018-07-14
      • 1970-01-01
      • 1970-01-01
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多