代码之家  ›  专栏  ›  技术社区  ›  Nick Kavadias

在if.中使用临时表。否则语句

  •  5
  • Nick Kavadias  · 技术社区  · 17 年前

    为什么SQL Server坚持临时表已经存在?一个或另一个会发生!!,所以永远不会是这样。

    declare @checkvar  varchar(10)
    declare @tbl TABLE( colx varchar(10) )
    set @checkvar ='a'
    
    INSERT  INTO @tbl (colx) VALUES('a')
    INSERT  INTO @tbl (colx) VALUES('b')
    INSERT  INTO @tbl (colx) VALUES('c')
    INSERT  INTO @tbl (colx) VALUES('d')
    
    IF @checkvar  is null  select colx INTO #temp1 FROM @tbl
    ELSE select colx INTO #temp1 FROM @tbl WHERE colx =@checkvar
    

    错误为:数据库中已存在名为“temp1”的对象。

    有没有优雅的方法可以解决这个问题? 如果@checkvar为空,则需要整个表 否则,只给我@checkvar=something的值

    编辑:列是varchar,而不是int。

    4 回复  |  直到 14 年前
        1
  •  5
  •   Rune Grimstad    17 年前

    你不能重写一下这句话吗?

    SELECT colx INTO #temp1 FROM @tbl WHERE (@checkvar IS NULL) OR (colx = @checkVar)
    
        2
  •  6
  •   Leigh josh poley    14 年前

    可以使用以下命令创建具有所需结构的空临时表: WHERE 1=0 . 然后用原始代码插入所需的记录

    SELECT colx INTO #temp1 
    FROM   @tbl 
    WHERE  1 = 0  // this is never true
    
    IF @checkvar  IS NULL
    BEGIN 
        INSERT INTO #temp1 (colName)   
        SELECT colx FROM @tbl 
    END
    ELSE 
    BEGIN 
        INSERT INTO #temp1 (colName)   
        SELECT colx 
        FROM   @tbl 
        WHERE  colx = @checkvar 
    END
    
        3
  •  3
  •   Brimstedt    17 年前

    如果这是存储过程,请选择..into将导致重新编译该过程。

    据我所知,最好在过程的顶部创建表,然后再进行常规插入。

    所以,我建议:

    CREATE TABLE #temp1 (colx ...)
    
    DECLARE @checkvar  VARCHAR(10)
    DECLARE @tbl TABLE( colx varchar(10) )
    SET @checkvar ='a'
    
    INSERT  INTO @tbl (colx) VALUES('a')
    INSERT  INTO @tbl (colx) VALUES('b')
    INSERT  INTO @tbl (colx) VALUES('c')
    INSERT  INTO @tbl (colx) VALUES('d')
    
    IF @checkvar IS NULL  
    BEGIN
      INSERT INTO #temp1(colx)
      SELECT colx 
      FROM @tbl
    END
    ELSE 
    BEGIN
      INSERT INTO #temp1(colx)
      SELECT colx 
       FROM @tbl WHERE colx =@checkvar
    END
    

    另外,这样你就可以摆脱或被其他解决方案提及(或是邪恶的;)

    /B

        4
  •  2
  •   Peter    17 年前
    drop table #temp1
    
    select colx into #temp1 
    from @tbl
    where (ISNULL(@checkvar,'0')='0' or [colx] = @checkvar )
    

    如果@checkvar存在,它将使用这个where语句,否则它将返回所有数据。您可以将“0”更改为任何您想要的值,只要它永远不是@checkvar的初始值。