2016-06-26 12 views
-2

次のコードを使用して1つのテーブルから別のテーブルへレコードを更新または挿入しましたが、重複レコードの場合は挿入ステートメントはスキップしません。どのように私はそれをバイパスできますか?TSQLマージ:<WHEN NOT MATCHED>は重複をスキップしません

次のエラーが発生します。私は、重複したレコードをスキップして、PRIMARY KEY 制約 'PK_MIBOMD_KEY_0' の新しい

メッセージ2627、レベル14、状態1、行6違反を挿入したいです。オブジェクト 'dbo.MIBOMD'に重複キーを挿入できません。重複するキー値は(、0、1)です。ステートメントには が終了しました。

MERGE [MIBOMD] AS TARGET 
USING [whl] AS SOURCE 


ON (TARGET.[bomItem] = SOURCE.ItemID AND TARGET.bomEntry = SOURCE.bomEntry AND TARGET.bomRev = SOURCE.rev) 

WHEN MATCHED AND TARGET.bomEntry = SOURCE.bomEntry 
AND TARGET.partId <> SOURCE.partid THEN 
UPDATE SET TARGET.partId = SOURCE.partid 

WHEN NOT MATCHED BY TARGET THEN 
INSERT (partId,bomEntry, srcLoc, qty, lead) 
VALUES (SOURCE.partid, SOURCE.bomEntry, 'R14SDS', SOURCE.qty, SOURCE.lead); 
+0

ソース( '[whl])に重複がないことを確認してください。 – tarheel

+0

@tarheel no、 '[whl]の主キーは' ItemID'と 'PartID'です。 [whl]の主キーはItemIDとPartIDなので、 'Item ID'だけが複数あるか重複していますが、' ItemID + Part ID'は一意です。 – user6305775

+0

@tarheel noです。複数のまたは重複したアイテムIDがあるだけですが、ItemID +パーツIDは一意です – user6305775

答えて

1

あなたが述べたように、ソース内の一意性はItemID + PartIDによって保証されています。 一方、ソース(ItemID,bomEntry,rev)=target.(bomItem,bomEntry,bomRev)で一致しています。

ソースに同じセットの(ItemID,bomEntry,rev)があり、2つの異なるPartIDがあることは完全に可能です。

また、指定したINSERTed列のうち、bomRev,bomItemはありません。
これらの列にデフォルトの制約はありますか?彼らは一意性を保証しますか?

関連する問題