具有相同的临时表名称和2个不同的IF语句

时间:2013-02-11 19:32:43

标签: sql sql-server

我已经解决了这个问题,因为我忽略了已经成为我的代码的一部分,并且不需要这种情况。

在SQL Server 2008中,我有两个IF语句

If value = ''
begin 
select * into #temptable from table 1
end
Else If value <> ''
begin 
select * into #temptable from table 2
end

但是当我尝试执行它时,由于第二个

而给我

不是Temptable:

There is already an object named '#temptable' in the database.

我不想使用另一个临时表名,因为我必须经常更改后面的代码。有没有办法绕过这个?

3 个答案:

答案 0 :(得分:2)

我建议您进行一些更改,以便您的代码更易于维护。您在此处设置方式的一个问题是使用的是SELECT *语法。如果您以后决定更改table1或table2的架构,则可能会产生非明显的后果。在生产代码中,最好拼出这些东西,以便清楚地确定您正在使用哪些列以及在哪里。

另外,您是否真的在下面的代码中使用表1和表2中的所有列?您可能会在性能损失中加载超出您需要的数据。我将浏览使用#temptable的代码并找出它实际使用的列。然后从创建临时表开始:

CREATE TABLE #temptable(col1 int, col2 int, col3 int, col4 int)

包括可以使用的所有可能列,即使其中某些列在某些情况下可能为null。据推测,后面的代码已经理解了这一点。然后你可以设置你的IF语句:

IF value = ''
BEGIN 
    INSERT INTO #temptable(col1, col2, col3)
    SELECT x,y,z
    FROM table1
END

ELSE
    INSERT INTO #temptable(col1, col4)
    SELECT alpha,beta
    FROM table2
END

答案 1 :(得分:0)

您所写的SELECT语句正在一个语句中创建临时表并将其插入到所有语句中。使用CREATE TABLE语句分别创建临时表,然后在两个IF语句中插入INTO。

答案 2 :(得分:0)

如您所知,使用SELECT INTO即时创建表格。即使您的查询仅引用#temptable一次,如果您要多次运行它(在第一次运行后不删除表),您将得到相同的错误(尽管如果它在存储过程中,它可能只存在于存储过程的范围内。)

但是,您甚至无法编译此查询。例如,即使同一个表用作源表,在以下查询中使用Parse命令(Ctrl+F5)也会失败。

select * into #temptable from SourceTable
select * into #temptable from SourceTable

如果表1和表2的结构相同,您可以执行以下操作。

select * into #temptable from
    (select * from Table1 where @value = ''
    union
    select * from Table2 where @value <> '') as T

但是,如果表格具有不同的结构,那么除了推荐agtD. Lambert之外,我不确定你能做什么。