Sql server TSQL合并:<;不匹配时>;不';不要跳过重复
我使用以下代码从一个表到另一个表更新或插入记录,但当复制记录时,Insert语句不会跳过。我怎么能绕过它 我得到以下错误。我想跳过重复记录并插入新记录 Msg 2627,14级,状态1,第6行违反主键 约束“PK_MIBOMD_KEY_0”。无法在对象中插入重复的键 “dbo.MIBOMD”。重复的键值为(,0,1)。该声明已经发布 已经终止Sql server TSQL合并:<;不匹配时>;不';不要跳过重复,sql-server,database,tsql,merge-statement,Sql Server,Database,Tsql,Merge Statement,我使用以下代码从一个表到另一个表更新或插入记录,但当复制记录时,Insert语句不会跳过。我怎么能绕过它 我得到以下错误。我想跳过重复记录并插入新记录 Msg 2627,14级,状态1,第6行违反主键 约束“PK_MIBOMD_KEY_0”。无法在对象中插入重复的键 “dbo.MIBOMD”。重复的键值为(,0,1)。该声明已经发布 已经终止 MERGE[MIBOMD]作为目标 使用[whl]作为源 ON(TARGET.[bomItem]=SOURCE.ItemID和TARGET.bomEntr
MERGE[MIBOMD]作为目标
使用[whl]作为源
ON(TARGET.[bomItem]=SOURCE.ItemID和TARGET.bomEntry=SOURCE.bomEntry和TARGET.bomRev=SOURCE.rev)
当匹配且TARGET.bomEntry=SOURCE.bomEntry时
然后是TARGET.partId SOURCE.partId
更新集TARGET.partId=SOURCE.partId
当目标不匹配时
插入(零件号、bomEntry、srcLoc、数量、铅)
值(SOURCE.partid、SOURCE.bomEntry、“R14SDS”、SOURCE.qty、SOURCE.lead);
如您所述,源代码中的唯一性由ItemID+PartID
保证。
同时,您正在按源(ItemID,bomEntry,rev)=目标进行匹配。(bomItem,bomEntry,bomRev)
您完全有可能在源代码中使用相同的(ItemID,bomEntry,rev)
,但有两个不同的PartID
此外,在您指定的插入的列中,没有bomRev、bomItem
。
这些列上是否有默认约束?它们会保证唯一性吗?您确定您的源代码([whl]
)没有重复项吗?@tarheel否,因为[whl]
上的主键是项目ID
和部分ID
。只有多个或重复的Item ID
s,但是Item ID+零件ID
是unique@tarheel否,因为[whl]上的主键是ItemID和PartID。只有多个或重复的项目ID,但项目ID+零件ID是唯一的。您可以在问题中添加一些示例数据吗?从您的代码或描述中不清楚问题出在哪里…@M.Ali我在问题的底部添加了两幅图像。
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);