Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在SQL大容量复制期间检查数据库中是否存在数据的任何方法_C#_Sql Server_Sqlbulkcopy - Fatal编程技术网

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

C# 在SQL大容量复制期间检查数据库中是否存在数据的任何方法,c#,sql-server,sqlbulkcopy,C#,Sql Server,Sqlbulkcopy,我正在将一些数据从一个SQL Server数据库复制到另一个SQL Server数据库 这很好,我需要的是检查一些数据是否已经存在,然后不复制它。我该怎么做?有什么建议吗 string Source = ConfigurationManager.ConnectionStrings["Db1"].ConnectionString; string Destination = ConfigurationManager.ConnectionStrings["Db2"].ConnectionString;

我正在将一些数据从一个SQL Server数据库复制到另一个SQL Server数据库

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

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);
            }
        }
    }
}

一种方法是批量复制到暂存表(具有类似布局的单独表),然后执行从暂存表到实际表的条件插入


您还可以使用表值参数(而不是
SqlBulkCopy
)执行类似操作,并将表值参数视为暂存表。

您可以创建从源数据库到目标数据库的数据库链接,并运行查询以确定哪些行需要传输,但要小心不要在链接上拖拽太多数据,因为这可能会使过程变慢——实际上,你只需要这些数据。用于确定源中的行是否等于目标中的行的列

通常,虽然将所有数据大容量复制到目标位置的临时表中更容易,但使用merge或insert leftjoin只将一些数据从临时表插入到实际表中

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

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
运行此操作

将源数据库中的所有表作为临时表复制到目标数据库,然后运行SQL将临时表中缺少的记录添加到目标表中。删除临时表的最后一步


希望这对您有用。

我们实现了这样一个解决方案,并以这种方式执行大规模更新。(更新而不是插入)。这一策略的执行时间是我们尝试过的任何其他方法中最低的,我不确定这是否说明了您的实施情况。合并或删除重新加载(使用分区)通常是最快的方法。如果您知道如何正确使用sql server。也就是说,您的负载发生了变化-您确实使用了合并,对吗?您关于如何使用sql的评论是不必要的。我们的用例中没有删除。我们不使用merge语句,因为系统在临时表中的sqlInsert中预合并,然后使用合并查询。谢谢。但是你能在我的代码中告诉我怎么做吗?:)我会加上,但我相信你已经知道了,这是一行c。。我不知道你的列名,所以还有一些工作要做