2015-07-10 61 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