【问题标题】:How to check temp table exists while Union multiple temp tables?联合多个临时表时如何检查临时表是否存在?
【发布时间】:2011-09-25 16:57:00
【问题描述】:

这里是我的查询-

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

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

【问题讨论】:

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


    【解决方案1】:

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

    所以没有办法在同一个批次中引用一个不存在的表

    你必须使用的模式是这样的:动态 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')
    ...
    

    【讨论】:

      【解决方案2】:

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

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

      与:

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

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

      现在,鉴于您已经说过只会填充一个(因此其他将是空的),这可能没有实际意义,但我总是倾向于使用 UNION ALL 来组合不相交的表格 - 除非您隐式依赖 @ 987654325@s 去重功能?


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

      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 ?就像我们声明 DECLARE @FinalTemp TABLE(Columns...) ??
      • @patel - 类似,我添加了一个示例。
      猜你喜欢
      • 2011-12-30
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 2012-06-28
      • 2013-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多