2016-06-26 44 views
-2

我使用以下代碼更新或從一個表插入記錄到另一個表,但插入語句不會在重複記錄時跳過。我怎樣才能繞過呢?TSQL合併:<WHEN NOT MATCHED>不會跳過重複

我收到以下錯誤消息。我想跳過重複記錄,並插入新

消息2627,級別14,狀態1,第6行違反PRIMARY KEY約束 'PK_MIBOMD_KEY_0' 的。不能在對象 '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否,因爲'[whl]'上的主鍵是'ItemID'和'PartID'。只有多個或重複的「商品ID」,但是「商品ID +零件ID」是唯一的 – user6305775

+0

@tarheel否,因爲[whl]上的主鍵是ItemID和PartID。只有多個或重複的項目ID,但ItemID + Part ID是唯一的 – user6305775

回答

1

正如你所說,在源的獨特性是由ItemID + PartID保證。 同時,您正在通過來源(ItemID,bomEntry,rev)=target.(bomItem,bomEntry,bomRev)進行匹配。

這是完全可能的,你將有一些東西在同一套(ItemID,bomEntry,rev)在源中,但有兩個不同的PartID

另外,在您指定的INSERTed列中,沒有bomRev,bomItem
這些列是否有默認約束?他們會保證唯一性嗎?