在IF .. ELSE语句中使用临时表

时间:2009-04-03 06:21:58

标签: sql sql-server sql-server-2005 tsql

为什么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为null,我想要整个表 否则,只给我@checkvar = something

的值

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

4 个答案:

答案 0 :(得分:6)

您可以使用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

答案 1 :(得分:5)

难道你不能只重写声明吗?

SELECT colx INTO #temp1 FROM @tbl WHERE (@checkvar IS NULL) OR (colx = @checkVar)

答案 2 :(得分:3)

如果这是一个存储过程,SELECT .. INTO将导致重新编译该过程。

据我所知,最好在程序的顶部创建表,然后再执行正常的INSERT。

所以,我建议:

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

此外,这样你就可以摆脱其他解决方案提到的OR(或者是邪恶的;)

/ B

答案 3 :(得分:2)

drop table #temp1

select colx into #temp1 
from @tbl
where (ISNULL(@checkvar,'0')='0' or [colx] = @checkvar )

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