2013-02-11 112 views
0

我已经解决了这个问题,因为我忽略了已经是我的代码的一部分,这种情况是不需要的。具有相同的临时表名称和2个不同的IF语句

在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. 

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

回答

0

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

+0

有问题的表格每次执行时都会使用不同数量的列动态创建。我如何创建这样的表格? – JohnZ 2013-02-11 19:39:49

+0

也许更多的上下文会有所帮助 - 你试图用这张有时看起来像“表1”并且有时看起来像“表2”的表完成什么? – 2013-02-11 19:44:34

2

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

另外,你是否真的使用表1和表2中的所有列后面的代码?加载更多数据可能会导致性能下降。我会通过使用#temptable的代码并找出它实际使用的列。然后通过创建临时表开始:

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

包括所有可以使用的可能列,即使其中一些可能是在某些情况下空。据推测,后面的代码已经明白这一点。然后,你可以设置你的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 
0

使用SELECT INTO创建该表上的苍蝇,你也知道。即使你的查询只引用了#temptable一次,如果你不止一次运行它(在第一次运行后不删除表),你会得到相同的错误(尽管如果它在存储过程中,它可能只存在在存储过程的范围内)。

但是,你甚至不能编译这个查询。例如,对以下查询使用“分析”命令(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建议。

相关问题