2015-07-10 3 views
1

Могу ли я игнорировать повторяющиеся записи данных, уже присутствующих в базе данных SQL, из данных, которые я передаю в SqlBulkCopy. Если да, то как и объясните, если нет и другой вариант.SqlBulkCopy Игнорировать повторяющиеся записи данных из базы данных

+0

Что относительно первичного ключа в вашей записи? у записи нет первичного ключа? –

+0

Одним из возможных решений является создание столбцов (таблиц) таблицы уникальным. И для этого нам нужно создать индекс в таблице с именами столбцов, которые мы хотим проверить на уникальность. –

ответ

0

Нет, это не встроенный. Сначала необходимо очистить данные на клиенте или вставить в промежуточную таблицу.

1

Как сказал предыдущий плакат, это не встроенный добиться подобного результата с помощью следующего:.

SQL хранимую процедуру, которая принимает TableValuedParameter с данными, вам требуется.

В сохраненной процедуре я затем вставляю все записи в временную таблицу. После этого вы можете использовать инструкцию SQL MERGE в сохраненном proc для вставки данных там, где они еще не существуют.

Итак, предположим, что наши данные - это просто имена людей, хранящиеся в таблице людей. Мы имеем только идентификатор и имя. Я также предполагаю, что эта таблица называется «люди».

Вот как я создаю мою таблицы оцененной тип параметра (созданную в 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, вы должны увидеть строки, вставленные, обновленные или проигнорированные.

Удачи.

+0

Да, спасибо GinjaNinja. Я получил то, что вы сказали. Можете ли вы дать мне пример кода для функции Table Valued Function и SQL Merge. Я использую Sql Server 2000 и .net 2.0 – Rahul

+0

Я изменил свой пост выше, а затем заметил, что вы на SQL 2000. Это не сработает, извините! – GinjaNinja

Смежные вопросы