0

我有一个接受批量产品信息的存储过程。对于每个产品,将其插入数据库或更新它(如果已存在)。

产品由复合键 -> ProductCompanyId(产品来自哪里)和ProductId(每个公司的唯一 ID)定义。

我正在尝试进行MERGE查询。它完美地工作,直到批次中不止一次具有相同的复合键。

例如,假设我有 10 种产品。其中 2 个具有相同的 comp-keys 但价格不同。

我以为第一行会被插入,第二行是更新。

是一些 FULL REPO sql 代码,向您展示我所做的事情。

尝试确保每批只有唯一的复合键太难了。那么,有什么我可以做的吗?

我正在使用 SQL Server 2012 .. 所以我不确定这是否是一个问题。

4

1 回答 1

2

MERGE您可以(应该)重写它以使用子查询或 CTE 过滤重复行并选择正确的行,而不是直接使用 @MergeData 作为语句的源MERGE

WITH CTE_MergeData AS 
(
    SELECT *
      , ROW_NUMBER() OVER (PARTITION BY ProductCompanyId, ProductId ORDER BY  ProductId DESC) RN --find some better order
    FROM @MergeData
)
MERGE INTO @SomeTable T
    USING (SELECT * FROM CTE_MergeData WHERE RN = 1) S
    ON T.ProductCompanyId = S.ProductCompanyId AND T.ProductId = S.ProductId
    WHEN MATCHED THEN
        UPDATE
        SET T.Name = S.Name,
            T.Price = S.Price
    WHEN NOT MATCHED THEN
        INSERT (ProductCompanyId, ProductId, Name, Price)
        VALUES (S.ProductCompanyId, S.ProductId, S.Name, S.Price)
    OUTPUT S.ProductCompanyId, S.ProductId, Inserted.Id INTO @MergeProductsResults;
于 2013-07-15T08:48:54.430 回答