我试图写入临时表,源数据可以来自两个不同的源,但是它们确实具有相同的架构。数据源由条件语句(如果只有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
答案 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;