我已经解决了这个问题,因为我忽略了已经成为我的代码的一部分,并且不需要这种情况。
在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
但是当我尝试执行它时,由于第二个
而给我There is already an object named '#temptable' in the database.
我不想使用另一个临时表名,因为我必须经常更改后面的代码。有没有办法绕过这个?
答案 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
但是,如果表格具有不同的结构,那么除了推荐agt和D. Lambert之外,我不确定你能做什么。