在 SQL 批量复制期间检查数据库中是否存在数据的任何方法

Any way to check if data exist in database during an SQL bulk copy

我正在将一些数据从一个 SQL 服务器数据库复制到另一个 SQL 服务器数据库。

很好用,我需要的是检查一些数据是否已经存在,然后不要复制它。我怎样才能做到这一点?有什么建议么?

string Source = ConfigurationManager.ConnectionStrings["Db1"].ConnectionString;
string Destination = ConfigurationManager.ConnectionStrings["Db2"].ConnectionString;

using (SqlConnection sourceCon = new SqlConnection(Source))
{
    SqlCommand cmd = new SqlCommand("SELECT [Id],[Client] FROM [Db1].[dbo].[Client]", sourceCon);
    sourceCon.Open();

    using (SqlDataReader rdr = cmd.ExecuteReader())
    {
        using (SqlConnection destCon = new SqlConnection(Destination))
        {
            using (SqlBulkCopy bc = new SqlBulkCopy(destCon))
            {
                    bc.DestinationTableName = "Clients";
                    bc.ColumnMappings.Add("Id", "ClientId");
                    bc.ColumnMappings.Add("Client", "Client");
                    destCon.Open();

                    bc.WriteToServer(rdr);
            }
        }
    }
}

一种方法是批量复制到 stagingtable(一个单独的 table,布局相似) , 然后执行条件插入从暂存 table 到真正的 table.

您也可以使用 table 值参数而不是 SqlBulkCopy 来做类似的事情,并将 table 值参数视为暂存 table .

您可以创建一个数据库 link 从源数据库到目标数据库,然后 运行 一个查询来确定哪些行需要传输,但要注意不要将太多数据拖过link 因为它可能会使过程变慢 - 实际上你只需要。您将用于确定源中的行是否等于目标中的行的列

通常情况下,将所有数据批量复制到目标位置的临时 table 中会更容易,然后使用合并或 insert-leftjoin 仅将一些数据从临时 table 插入到真实 table

下面是一个如何仅插入一些尚不存在的行的示例:

INSERT INTO real(column1,column2...)
SELECT temp.column1,temp.column2... FROM
  temp 
  LEFT JOIN real ON real.ID = temp.ID
WHERE 
  real.ID IS NULL

在 C# 术语中它看起来像:

  new SqlCommand(@"INSERT INTO real(column1,column2...)
SELECT temp.column1,temp.column2... FROM
  temp 
  LEFT JOIN real ON real.ID = temp.ID
WHERE 
  real.ID IS NULL", conn).ExecuteNonQuery();

您需要 运行 使用 conn 连接到您的目标数据库

将源数据库中的所有 tables 作为临时 tables 复制到目标数据库,然后 运行 SQL 从临时 SQL 添加丢失的记录 table到目的地table。最后一步删除temp tables.

希望对你有用。