两个选择:
- 编写更新语句以更新任何现有行,并使用插入语句进行跟踪,以插入新行。这将在两个操作中运行,但将允许您完全独立地维护逻辑。
- 使用merge运算符可以在单个操作中执行多个操作。
在存储过程中包装1或2,然后简单地从SSIS调用该过程。就个人而言,我使用示例1的一个版本,其中插入/更新代码是独立包装的过程,upsert过程只需按照正确的顺序调用。这比示例2效率稍低,但我发现它是一种更灵活和可维护的模式(尤其是在与table-valued parameters配对时)。
实施例1:
create procedure dbo.usp_MyTable_Upsert
as
begin;
update <Target>
set ...
from <Source>
join <Target>
on ...;
insert into <Target>(...)
select ...
from <Source>
where not exists (
select 1
from <Target>
where ...
);
end;
实施例2:
create procedure dbo.usp_MyTable_Upsert
as
begin;
merge <Target>
using <Source>
on ...
when matched then
update
set ...
when not matched by target then
insert ...
when not matched by source then
delete;
end;
你好。感谢您的反馈意见。请提供一些例子以示热心? – Key
@SashaStecovych我已经添加了两个使用伪代码的示例,旨在传达您需要执行的操作的“形状”。我在'merge'上提供的链接提供了几个使用AdventureWorks2012数据库的实例。 – Kittoes0124
我的建议是使用合并。它更灵活。但是,与IF .. ELSE一样,*不保证是原子操作。 –