sql server 2005-如何在联合多个临时表时检查临时表是否存在



这里是我的查询-

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

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

在编译时不能对不存在的对象进行并集或查询(在执行前编译到查询计划(。

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

您必须使用的模式如下:动态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 */

带有:

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,
)

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

相关内容

  • 没有找到相关文章

最新更新