SqlBulkCopy忽略数据库中数据库的重复记录

我可以从我传递给SqlBulkCopy的数据表中忽略已存在于sql数据库中的数据的重复记录。 如果是,则如何,如果没有和其他选项也解释我。

正如之前的海报所说,这不是内置的。我使用以下内容实现类似:

SQL存储过程,它接受带有所需数据的TableValuedParameter。

在存储过程中,然后我将所有记录INSERT到临时表中。 一旦你有了它,你可以在存储过程中使用SQLs MERGE语句来插入尚不存在的数据。

所以,让我们假设我们的数据只是将人们的名字存储在一个表人中。 我们只持有一个ID和一个名字。 我还假设这张桌子叫做’人’。

以下是我创建表值参数类型(在SQL Server中创建)的方法

CREATE TYPE udt_person AS TABLE( [id] [INT] NOT NULL, [name] [nvarchar(50)] NULL ) GO 

我现在创建存储过程:

 CREATE PROCEDURE SaveNewPeople @pPeople udt_Person AS BEGIN -- Create Temp table CREATE TABLE #tmpPeople (id INT, name VARCHAR 50) -- We will stage all data passed in into temp table INSERT INTO #tmpPeople SELECT id, name FROM @pPeople -- NB: you will need to think about locking strategy a bit here MERGE people AS p USING #tmpPeople AS t ON p.id = t.id WHEN NOT MATCHED BY TARGET THEN -- We want to insert new person INSERT (id, name) VALUES (t.id, t.name) WHEN MATCHED THEN -- you may not need this, assume updating name for example UPDATE SET p.name = t.name END 

现在我们已经安装了SQL。

让我们在C#中创建大量数据:

 DataTable ppl = new DataTable(); ppl.Columns.Add("id", typeof(int)); ppl.Columns.Add("name", typeof(string)); // table is created, let's add some people var bob = ppl.NewRow(); bob["id"] = 1; bob["name"] = "Bob"; ppl.Rows.Add(bob); var jim = ppl.NewRow(); jim["id"] = 2; jim["name"] = "Jim"; ppl.Rows.Add(jim); // that's enough people for now, let's call the stored procedure using(var conn = new SqlConnection("YouConnStringHere")) { using(var cmd = new SqlCommand("SaveNewPeople", conn)) { cmd.CommandType = CommandType.StoredProcedure; var tvp = new SqlParameter { ParameterName = "@pPeople", SqlDbType = SqlDbType.Structured, Value = ppl, TypeName = "udt_person" } cmd.Parameters.Add(tvp); conn.Open(); cmd.ExecuteNonQuery(); } } 

希望这会给你一个想法。 如果您随后修改了C#datatable,则应该看到插入,更新或忽略的行。

祝好运。

不,那不是内置的。 您需要清理客户端上的数据或首先插入到临时表中。