首页 > 解决方案 > 了解批量插入的 SQL Server 合并问题

问题描述

我生成一个,我首先从C# 中DataTable删除所有行。DataTable

然后我将 DataTable 传递给批量插入的存储过程,但我随机收到错误消息:

Merge 语句多次更新/删除同一行。当目标行匹配多个源行时会发生这种情况。

但令我困惑的是,在将 DataTable 发送到存储过程之前,我从 DataTable 中删除了所有重复的行。

代码:

public static DataTable RemoveDuplicateRows(DataTable dTable, string colName)
{
    Hashtable hTable = new Hashtable();
    ArrayList duplicateList = new ArrayList();

    //Add list of all the unique item value to hashtable, which stores combination of key, value pair.
    //And add duplicate item value in arraylist.
    foreach (DataRow drow in dTable.Rows)
    {
        if (hTable.Contains(drow[colName]))
            duplicateList.Add(drow);
        else
            hTable.Add(drow[colName], string.Empty);
    }

    //Removing a list of duplicate items from datatable.
    foreach (DataRow dRow in duplicateList)
        dTable.Rows.Remove(dRow);

    //Datatable which contains unique records will be return as output.
    return dTable;
}

这是程序:

ALTER PROCEDURE [dbo].[Update_DataFeed_Discoverable]
  @tblCustomers DateFeed_Discoverable READONLY
  AS
  BEGIN
  SET NOCOUNT ON;

  MERGE INTO DataFeed c1
  USING @tblCustomers c2
  ON c1.CheckSumProductName=checksum(c2.aw_deep_link)
  WHEN MATCHED THEN
  UPDATE SET 
        c1.merchant_name = c2.merchant_name
        ,c1.aw_deep_link = c2.aw_deep_link
        ,c1.brand_name = c2.brand_name
        ,c1.product_name = c2.product_name
        ,c1.merchant_image_url = c2.merchant_image_url
        ,c1.Price = c2.Price

  WHEN NOT MATCHED THEN
  INSERT VALUES(c2.merchant_name, c2.aw_deep_link,
  c2.brand_name, c2.product_name, c2.merchant_image_url,
  c2.Price,1,checksum(c2.aw_deep_link)

  );
END

如果在使用 DataTable 之前未插入和删除它们,是否会出现重复行。

任何帮助表示赞赏。

标签: c#sql-servermergebulkinsert

解决方案


推荐阅读