IGNORE_DUP_KEYを使用してテーブルに制約があります。これにより、一部のレコードが重複している場合とそうでない場合(非重複を挿入するだけ)で、一括挿入を部分的に機能させることができます。ただし、更新を部分的に機能させることはできません。複製が作成されないレコードのみを更新する必要があります。
更新を適用するときにIGNORE_DUP_KEYをサポートする方法を知っている人はいますか?
MSSQL2005を使用しています
IGNORE_DUP_KEYを使用してテーブルに制約があります。これにより、一部のレコードが重複している場合とそうでない場合(非重複を挿入するだけ)で、一括挿入を部分的に機能させることができます。ただし、更新を部分的に機能させることはできません。複製が作成されないレコードのみを更新する必要があります。
更新を適用するときにIGNORE_DUP_KEYをサポートする方法を知っている人はいますか?
MSSQL2005を使用しています
実際に何が起こっているのかはわかりませんが、一括読み込みプロセスの一部として重複を挿入して主キーを更新する場合は、ステージングテーブルが解決策になる可能性があります。一括ロードの前に空であることを確認するテーブルを作成し、ファイルから100%の生データをロードして、そのデータを実際のテーブルに処理します(セットベースが最適です)。次のようにして、まだ存在していないすべての行を挿入できます。
INSERT INTO RealTable
(pk, col1, col2, col3)
SELECT
pk, col1, col2, col3
FROM StageTable s
WHERE NOT EXISTS (SELECT
1
FROM RealTable r
WHERE s.pk=r.pk
)
そもそも重複を防ぐのが最善です。ステージングテーブルなどに参加することで、実際のテーブルでUPDATEを実行することもできます。これにより、制約を「回避」する必要がなくなります。制約を回避すると、通常、見つけにくいバグが作成されます。
私が正しく理解していれば、重複の作成を避けるために必要なWHEREロジックを指定せずにUPDATEを実行したいですか?
create table #t (col1 int not null, col2 int not null, primary key (col1, col2))
insert into #t
select 1, 1 union all
select 1, 2 union all
select 2, 3
-- you want to do just this...
update #t set col2 = 1
-- ... but you really need to do this
update #t set col2 = 1
where not exists (
select * from #t t2
where #t.col1 = t2.col1 and col2 = 1
)
頭に浮かぶ主なオプションは次のとおりです。
何をしようとしているのか、どの環境で作業しているのかによって異なるため、どちらが最適かは誰にもわからないと思います。ただし、行ごとの処理によって誤検知が発生する可能性があるため、セットベースのアプローチに固執しようとします。
MERGEステートメントを使用する必要があると感じています。その後、更新部分では、一意にしたいキーを実際には更新しないでください。これは、キーが一意であることをテーブルで定義する必要があることも意味します(一意のインデックスを設定するか、主キーとして定義します)。その後、重複キーを使用した更新または挿入は失敗します。
編集:私はこのリンクがそれに役立つと思います: