使用SqlBulkCopy

时间:2018-04-17 12:50:59

标签: c# sql sql-server sqlbulkcopy

我正在尝试使用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 ......但是没有一个选项(或者可能是另一个类?)我可以用来保持简单快捷吗?

2 个答案:

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