联合多个临时表时如何检查临时表?

时间:2011-06-30 05:52:31

标签: sql-server-2005 union temp-tables

这里是我的查询 -

SELECT final.* into #FinalTemp from
    (   
    select * from #temp1 
        UNION 
    select * from #temp2 
        UNION 
    select * from #temp3 
        UNION 
    select * from #temp4
)final

但是一次只存在一个临时表,那么如何检查#temp是否存在然后进行联合或忽略?

2 个答案:

答案 0 :(得分:0)

在编译时不能对不存在的对象进行联合或查询(在执行之前编译为查询计划)。

因此无法在同一批次中引用不存在的表

您必须使用的模式是这样的:动态SQL是一个单独的批处理

IF OBJECT('tempdb..#temp1') IS NOT NULL
  EXEC ('SELECT * FROM #temp1')
ELSE IF OBJECT('tempdb..#temp3') IS NOT NULL
  EXEC ('SELECT * FROM #temp3')
ELSE IF OBJECT('tempdb..#temp3') IS NOT NULL
  EXEC ('SELECT * FROM #temp3')
...

答案 1 :(得分:0)

您是不是更好地在查询顶部创建#FinalTemp作为显式临时表,然后替换现有的填充方法,我假设如下:

SELECT * INTO #temp1 FROM ... /* Rest of Query */

使用:

INSERT INTO #FinalTemp (Columns...)
SELECT * FROM ... /* Rest of Query */

然后你根本不需要做最后的联合步骤。或者,如果您确实需要4个单独的临时表(可能需要对每个临时表执行多步操作),请在查询开始时定义每个临时表,然后在执行联合时全部存在

现在,鉴于你已经说过只会填充一个(所以其他的将是空的),这可能没什么问题,但我总是倾向于使用UNION ALL来组合不相交的表 - 除非你暗中依赖在UNION重复删除功能上?


您可以使用与实际表格相同的语法声明临时表:

CREATE TABLE #FinalTemp (
    ColumnA int not null primary key,
    ColumnB varchar(20) not null,
    ColumnC decimal(19,5) null,
)

或者,正如您所提到的,您可以使用表变量而不是临时表:

declare @FinalTemp table (
    ColumnA int not null primary key,
    ColumnB varchar(20) not null,
    ColumnC decimal(19,5) null,
)

主要的不同(就我而言)是表变量遵循与其他变量相同的作用域规则 - 它们在被调用的存储过程中不可用,并且它们在批次之间被清理。