Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 如何在合并多个临时表时检查临时表是否存在?_Sql Server 2005_Union_Temp Tables - Fatal编程技术网

Sql server 2005 如何在合并多个临时表时检查临时表是否存在?

Sql server 2005 如何在合并多个临时表时检查临时表是否存在?,sql-server-2005,union,temp-tables,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 但一次只存在一个临时表,所以如何检查临时表是否存在,然后执行union或ignor

这是我的问题-

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

但一次只存在一个临时表,所以如何检查临时表是否存在,然后执行union或ignore

在编译时,不能对不存在的对象进行联合或查询,而要在执行之前编译为查询计划

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

必须使用的模式如下:动态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')
...

在查询的顶部创建FinalTemp作为显式临时表,然后替换现有的填充方法(我假设如下所示),这样会更好吗

SELECT * INTO #temp1 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,
)

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

但是如何声明FinalTemp?就像我们声明@FinalTemp TABLEColumns@帕特尔-类似的,我添加了一个例子。
declare @FinalTemp table (
    ColumnA int not null primary key,
    ColumnB varchar(20) not null,
    ColumnC decimal(19,5) null,
)