2015-07-10 66 views
1

我可以忽略SQL数据库已经存在从我传递到SqlBulkCopy的数据表中数据的重复记录。如果是,那么如何解释我,如果否和其他选项。SqlBulkCopy的忽略的数据表中重复的记录从数据库

+0

你记录中的主键是什么?该记录是否没有主键? –

+0

一个可能的解决方案是使该表的列唯一。为此,我们必须在表格中创建一个索引,并使用列名称来检查唯一性。 –

回答

0

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

1

正如以前的海报说,这是不是建立在我使用下面的实现类似:

SQL存储过程,接受你所需要的数据TableValuedParameter。

在存储过程中,我然后将所有记录插入临时表。一旦你有了它,你可以在存储过程中使用SQL 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#数据表,您应该看到插入,更新或忽略的行。

祝你好运。

+0

是的,谢谢GinjaNinja。我有你说的。你能否给我一个表值函数和SQL合并语句的代码示例。我正在使用Sql Server 2000和.net 2.0 – Rahul

+0

我修改了我的上面的帖子,然后注意到你在SQL 2000上。这不起作用,对不起! – GinjaNinja