SQLBulkCopy non copia le chiavi primarie

c# sqlbulkcopy sql-server

Domanda

Qual è il modo migliore per gestire gli errori di violazione della chiave primaria quando si utilizza SQLBulkCopy

Violation of PRIMARY KEY constraint 'email_k__'. Cannot insert duplicate key in object  'lntmuser.email'.

(cioè se la riga esiste già nella tabella di destinazione)?

C'è un modo per saltare l'inserimento di righe duplicate o dovrebbe essere controllato e gestito prima?

Ecco il codice che sto usando attualmente:

  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();

Risposta accettata

Di solito finisco per eseguire un'operazione di Bulk Copy su una tabella temporanea e quindi copiare i dati da essa nella tabella di destinazione utilizzando SQL regolare. Questo mi consente di eseguire "aggiornamenti collettivi", oltre a occuparmi di situazioni speciali come questa (anche se non ho riscontrato questa necessità specifica).

C'è un calo di prestazioni rispetto alla copia bulk diretta, ma è ancora molto più veloce rispetto all'attivazione di INSERT.


Risposta popolare

È possibile regolare la query di origine per escludere duplicati. Per esempio:

select distinct * from dbo.email

O per filtrare per il primo col1 per pkcol :

select  *
from    (
        select  row_number() over (parition by pkcol order by col1) as rn
        from    dbo.email
        ) as SubQueryAlias
where   rn = 1


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow