二つの選択肢に製品セットビットのActive列のデータを無効にする必要があります。
- 既存の行を更新し、新しい行を挿入するinsert文をフォローアップするための更新文を記述します。これは2つの操作で実行されますが、論理を完全に独立して維持することができます。
- merge演算子を使用すると、1回の操作で複数のアクションを実行できます。
ストアドプロシージャで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私は擬似コードを使用して2つの例を追加しました。これはあなたがしなければならないことの「形」を伝えることを意図しています。私が 'merge'で提供したリンクは、AdventureWorks2012データベースを使用したいくつかの実際の例を示しています。 – Kittoes0124
私はMergeを使用することをお勧めします。より柔軟です。しかし、IFと同様、ELSEはアトミックな操作であることは保証されていません。 –