0

製品情報のバッチを受け入れるストアド プロシージャがあります。製品ごとに、DB に挿入するか、既に存在する場合は更新します。

製品は、複合キー -> ProductCompanyId(製品がどこから来たのか) とProductId(会社ごとの一意の ID) によって定義されます。

クエリを実行しようとしていMERGEます。バッチに同じ複合キーが複数回含まれるまで、完全に機能します。

たとえば、10 個の製品があるとします。これらのうちの 2 つのコンプキーは同じですが、価格が異なります。

最初の「行」が挿入され、2行目が更新されると思いました。

これは、私が行ったことを示す完全な REPO SQL コードです。

バッチごとに一意の複合キーのみが存在することを確認するのは非常に困難です。それで、私にできることはありますか?

私はSQL Server 2012を使用しています..それが問題かどうかはわかりません。

4

1 に答える 1

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;
于 2013-07-15T08:48:54.430 に答える