【发布时间】:2019-02-21 16:38:18
【问题描述】:
我在合并语句中注意到源表中有 PackageId 或 0 的行。这些记录不应插入到目标表中。所以我想在我的 INSERT 上有这个条件。
MERGE MyTargetTable AS TARGET
USING MySourceTable AS SOURCE
ON (SOURCE.orderidHash = TARGET.Id)
WHEN MATCHED AND (TARGET.CustomerId <> SOURCE.CustomerId
OR TARGET.PackageId <> SOURCE.packageid
OR TARGET.TypeId <> SOURCE.ordertypeid
OR TARGET.Created <> SOURCE.Created
OR TARGET.Updated <> SOURCE.Changed)
THEN
UPDATE SET TARGET.CustomerId = SOURCE.customeridHash,
TARGET.PackageId = SOURCE.packageid,
TARGET.TypeId = SOURCE.ordertypeid,
TARGET.Created = SOURCE.Created,
TARGET.Updated = SOURCE.Changed
WHEN NOT MATCHED BY TARGET
INSERT (
Id,
CustomerId,
PackageId,
TypeId,
Created,
Updated
)
VALUES (
SOURCE.orderidHash,
SOURCE.customeridHash,
SOURCE.packageid,
SOURCE.ordertypeid,
SOURCE.Created,
SOURCE.changed
)
WHEN NOT MATCHED BY SOURCE THEN DELETE;
在上面的声明中我应该在哪里使用WHERE PackageId <> 0?当我将条件放在WHEN NOT MATCHED BY TARGET 之后时,我收到错误消息:
MERGE 语句与 FOREIGN KEY 约束“FK_MyTargetTable_DimCustomer”冲突。冲突发生在数据库 MyDatabase、表 DimCustomer、列 Id 中。
MyTargetTable.CustomerId 是 DimCustomer.Id 的 FK。
【问题讨论】:
-
将插入限制为更少的行不可能触发外键错误。你这里还有一个问题。发布完整的错误消息,您将看到哪个 FK 失败了。
-
您是否尝试过使用单独的语句?这是我对任何遇到
MERGE问题的人的建议(不要介意那些你还不知道的问题)。见this article... -
@EzLo 我更新了错误消息。显然,与表
DimCustomer存在外键冲突。
标签: sql sql-server tsql merge