C# 使用SqlBulkCopy时跳过现有记录
我正在尝试使用SqlBulkCopy将行从一个SQL表复制到另一个SQL表。C# 使用SqlBulkCopy时跳过现有记录,c#,sql,sql-server,sqlbulkcopy,C#,Sql,Sql Server,Sqlbulkcopy,我正在尝试使用SqlBulkCopy将行从一个SQL表复制到另一个SQL表。 当我的目标表已经包含一个带有我试图添加的主键的元组时,它工作得很好。 现在,我要寻找的是一个选项,如果目标表中已经存在元组,则可以跳过它。 请问,有人能给我指一下正确的方向吗 到目前为止,我的代码如下所示: using(SqlConnection source = new SqlConnection(sourceConnectionstring)) { source.Open(); SqlComman
当我的目标表已经包含一个带有我试图添加的主键的元组时,它工作得很好。
现在,我要寻找的是一个选项,如果目标表中已经存在元组,则可以跳过它。
请问,有人能给我指一下正确的方向吗 到目前为止,我的代码如下所示:
using(SqlConnection source = new SqlConnection(sourceConnectionstring))
{
source.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM MyTable");
SqlDataReader reader = cmd.ExecuteReader();
using(SqlBulkCopy bulkData = new SqlBulkCopy(destinationConnectionstring))
{
bulkData.DestinationTableName = "MyTable";
bulkData.WriteToServer(reader);
}
}
我想一个(可怕的)方法是创建一个只包含目标表中不存在的元组的DataTable。。。但是,是否有一个选项(或者可能是另一个类?)可以让它保持简单和快速?我不知道SqlBulkCopy类上有任何选项可以跳过重复的键。您可以尝试在目标表中的主键上启用“忽略重复键”选项。这将要求您必须删除主键约束并按如下方式重新创建它:
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[YourTable]') AND name = N'YourPrimaryKey')
ALTER TABLE [dbo].[YourTable] DROP CONSTRAINT [YourPrimaryKey]
GO
/****** Object: Index [PK_PKallowDup] Script Date: 05/22/2012 10:23:13 ******/
ALTER TABLE [dbo].[YourTable] ADD CONSTRAINT [YourPrimaryKey] PRIMARY KEY CLUSTERED
(
[YourPrimaryKeyColumn] ASC
)WITH (IGNORE_DUP_KEY = ON, PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
但是有没有一个选项(或者一个不同的类?)可以让我保持简单和快速
否,对于SqlBulkCopy
免责声明:我是项目的所有者
此库不是免费的,但提供您正在寻找的InsertIfNotExists
选项
using(SqlConnection source = new SqlConnection(sourceConnectionstring))
{
source.Open();
SqlCommand cmd = new SqlCommand("SELECT * FROM MyTable");
SqlDataReader reader = cmd.ExecuteReader();
using(BulkOperation bulkData = new BulkOperation(destinationConnectionstring))
{
bulkData.DestinationTableName = "MyTable";
// INSERT only if row doesn't exist in the destination
bulkData.InsertIfNotExists = true;
bulkData.WriteToServer(reader);
}
}
将select查询更改为仅选择要插入到另一个表中的行。为什么在使用大容量复制之前创建一个datatable并对其进行筛选会是一个糟糕的主意?或者向SQL查询中添加DISTINCT或WHERE子句。