如何从不同的表中有条件地插入?
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 的好时机。
我正在编写一个存储过程来做一些常见的检查,在存储过程中我有如下代码以避免创建太多 @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 的好时机。