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

Sql server 是否可以使用SELECT INTO写入同一临时表?,sql-server,tsql,Sql Server,Tsql,我试图写入一个临时表,源数据可以来自两个不同的源,但它们有相同的模式。如果只有一条语句可以执行,则数据源由条件语句选择,但sql似乎不喜欢这样。它抱怨表已经存在。这是一段代码。Msg 2714,16级,状态1,程序sp_xxx,第37行[批次起始行0] 数据库中已存在名为“my_temp_table”的对象 IF @flag = 0 SELECT * INTO #my_temp_table FROM source_A ELSE

我试图写入一个临时表,源数据可以来自两个不同的源,但它们有相同的模式。如果只有一条语句可以执行,则数据源由条件语句选择,但sql似乎不喜欢这样。它抱怨表已经存在。这是一段代码。Msg 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

这里有几件事对你来说是或将是问题

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;

这是一个解析错误。您不能在同一批中尝试创建同一对象两次,即使逻辑指示两条语句都不能运行。如果两个对象source_A和source_B的定义相同,则将首先使用正确的定义创建临时表,然后插入其中。如果没有,则使用不同的对象名称,因为具有相同名称但不同定义的对象只会给您带来麻烦。上面的*只是为了简化查询。用where条件结合的方法,解决了我的问题。奇怪的是,对于我的t-sql,由于IF-ELSE语句,它保证了在SELECT INTO之前临时表不会存在。看起来解析器只是在检测同一个表中的多个SELECT,并决定它是不允许的,但这两种情况都无法执行。