2013-07-15 17 views
0

我有一个接受批量产品信息的存储过程。对于每种产品,请将其插入数据库或更新它(如果已存在)。试图做一个SQL合并语句,但它的错误

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

我正在尝试执行MERGE查询。它可以很好地工作,直到批次不止一次具有相同的组合键。

例如,让我想象我有10个产品。其中2个具有相同的组件,但价格不同。

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

Here is some FULL REPO sql code向你展示我所做的。

要想确保每批只有唯一的复合键是非常困难的。那么,我能做些什么吗?

我正在使用SQL Server 2012 ..所以我不知道这是一个问题。

回答

2

而不是直接使用@MergeData为您MERGE声明的来源,你可以(应该)重写它使用子查询或CTE将过滤重复的行,并选择正确的一个在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; 
+0

使用哈辉煌!当然:)过滤器独特的BEFORE我合并它。活泉! –