在 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.
希望对你有用。
我正在将一些数据从一个 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.
希望对你有用。