如何从不同的表中有条件地插入?

How to conditional INSERT INTO from different tables?

我正在编写一个存储过程来做一些常见的检查,在存储过程中我有如下代码以避免创建太多 @variables:

IF type = 'spl' 
THEN BEGIN
    SELECT col1, col4, col5, col9, col20, ... INTO #tmp
    FROM tbl1 
    WHERE primary_key = unique_id
END
ELSE BEGIN
    SELECT col1, col5, col7, col8, col19, ... INTO #tmp
    FROM tbl2
    WHERE primary_key = unique_id
END

虽然这两个INSERT不可能同时运行,但还是会导致#tmp table already exist错误,无法创建存储过程。

是否有任何通用的解决方法?

下面当然是可以的,但是看起来比声明几十个@variables还差。但这是我唯一能想到的atm。

SELECT * 
INTO #TEMP 
FROM 
     (SELECT 
          CASE WHEN type = 'spl' 
                  THEN a.col1 
                  ELSE b.col1 
               END, 
   ...
   FROM ... CROSS JOIN ... 
)

您可以从多个数据源执行 "conditional" 插入,方法是将它们与 union all 组合并使用单独的 where 子句,这些子句只会导致一个数据源生成行:

insert into #tmp
  select col1, col2, ...
    from tbl1
    where @type = 'spl' and primary_key = unique_id
  union all
  select col1, col2, ...
    from tbl2
    where @type <> 'spl' and primary_key = unique_id;

如果您想要为您创建输出 table,您可以将 select ... into ...where 子句一起使用,以防止插入任何行。结果将是具有正确架构的空 table:

-- Create empty   #tmp   table.
select col1, col2, ...
  from tbl1
  into #tmp
  where 42 = 6 * 9; -- Answer to the Ultimate Question of Life, the Universe, and Everything.

请注意,使用 if/then 执行单独的查询允许查询优化器为 每个 查询而不是整个 [=12] 生成最佳计划=] 混搭,使长期维护的意图更加清晰。

现在可能也是阅读 parameter sniffing 的好时机。