我正在尝试使用SqlBulkCopy将行从一个SQL表复制到另一个SQL表 当我的目标表已经包含一个带有我想要添加的主键的元组时,它运行良好 现在我正在寻找的是跳过元组的选项,如果它已经存在于目标表中 拜托,有人能向我暗示正确的方向吗?
到目前为止我的代码看起来像这样:
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 ......但是没有一个选项(或者可能是另一个类?)我可以用来保持简单快捷吗?
答案 0 :(得分:1)
我不知道SqlBulkCopy类上有任何跳过重复键的选项。您可以尝试在目标表中的主键上设置IGNORE_DUP_KEY选项。这将要求您必须删除主键约束并重新创建它,如下所示:
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]
答案 1 :(得分:0)
但是,我可以使用它来保持简单快捷的选项(或者不同的类吗?)?
不,SqlBulkCopy
免责声明:我是该项目的所有者Bulk Operations
此库不是免费的,但提供您正在寻找的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);
}
}