Каков наилучший способ борьбы с ошибками нарушения первичного ключа при использовании SQLBulkCopy
Violation of PRIMARY KEY constraint 'email_k__'. Cannot insert duplicate key in object 'lntmuser.email'.
(т. е. если строка уже существует в таблице назначения)?
Есть ли способ пропустить вставку повторяющихся строк или это нужно проверить и обработать перед рукой?
Вот код, который я использую в настоящее время:
var conPro = tx_ProConStr.Text;
var conArc = tx_ArcConStr.Text;
var con = new SqlConnection {ConnectionString = conPro};
var cmd = new SqlCommand("SELECT * FROM dbo.email", con);
con.Open();
var rdr = cmd.ExecuteReader();
var sbc = new SqlBulkCopy(conArc) {DestinationTableName = "dbo.email"};
sbc.WriteToServer(rdr);
sbc.Close();
rdr.Close();
con.Close();
Обычно я запускаю операцию массовой копии во временную таблицу и затем копирую данные из нее в целевую таблицу с использованием обычного SQL. Это позволяет мне выполнять «массовые обновления», а также заниматься такими особыми ситуациями (хотя я не сталкивался с этой конкретной необходимостью).
Есть хит производительности по сравнению с прямой копией, но он все еще намного быстрее, чем выполнение INSERT.
Вы можете настроить исходный запрос, чтобы исключить дубликаты. Например:
select distinct * from dbo.email
Или для фильтрации первого col1
на pkcol
:
select *
from (
select row_number() over (parition by pkcol order by col1) as rn
from dbo.email
) as SubQueryAlias
where rn = 1