Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/88.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# 使用SqlBulkCopy时跳过现有记录_C#_Sql_Sql Server_Sqlbulkcopy - Fatal编程技术网

C# 使用SqlBulkCopy时跳过现有记录

C# 使用SqlBulkCopy时跳过现有记录,c#,sql,sql-server,sqlbulkcopy,C#,Sql,Sql Server,Sqlbulkcopy,我正在尝试使用SqlBulkCopy将行从一个SQL表复制到另一个SQL表。 当我的目标表已经包含一个带有我试图添加的主键的元组时,它工作得很好。 现在,我要寻找的是一个选项,如果目标表中已经存在元组,则可以跳过它。 请问,有人能给我指一下正确的方向吗 到目前为止,我的代码如下所示: using(SqlConnection source = new SqlConnection(sourceConnectionstring)) { source.Open(); SqlComman

我正在尝试使用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。。。但是,是否有一个选项(或者可能是另一个类?)可以让它保持简单和快速?

我不知道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子句。