0

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

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

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

4

3 回答 3

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
于 2013-02-11T19:53:08.773 回答
0

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

于 2013-02-11T19:36:20.857 回答
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推荐的内容之外,我不确定您能做什么。

于 2013-02-12T01:30:56.983 回答