是否可以使用SELECT INTO写入同一临时表?

时间:2020-08-06 14:33:59

标签: sql-server tsql

我试图写入临时表,源数据可以来自两个不同的源,但是它们确实具有相同的架构。数据源由条件语句(如果只有ELSE可以执行)选择,但sql似乎不喜欢这样。它抱怨表已经存在。这是一段代码。 “消息2714,级别16,状态1,过程sp_xxx,第37行[批处理开始第0行] 数据库中已经有一个名为“ #my_temp_table”的对象。 “

IF @flag = 0 
    
    SELECT * INTO #my_temp_table 
    FROM source_A
    
ELSE             
    BEGIN
        --even tho the temp table will not exist i am trying to by pass the error 
        IF OBJECT_ID('tempdb..#my_temp_table ') IS NOT NULL
            DROP TABLE #my_temp_table 

        SELECT * INTO #my_temp_table 
        FROM source_B
    END

1 个答案:

答案 0 :(得分:1)

这里发生的几件事对您来说都是或将成为问题。

SQL Server的SELECT...INTO逻辑是Microsoft选择实施更标准的CREATE TABLE AS...语法(然后在大多数方言中使用SELECT语句)的方式。您只能创建一次该表,然后该表在那里。

本地临时表(带有单个#)将继续存在,直到您的会话与实例断开连接为止。因此,如果您尝试在不断开连接的情况下两次运行以上代码,它将失败。

您正在使用SELECT *,当有人更改一个源表的架构时,它会咬住您。

所有这些,您不需要所有逻辑。您可以通过一个查询完成您想要的事情。

SELECT
  <Column List>
INTO #my_temp_table 
FROM 
  source_A
WHERE @flag = 0
UNION
SELECT
  <Column List>
FROM 
  source_B
WHERE @flag <> 0;