SqlBulkCopy, has very limited error handling facilities, by default it doesn't even check constraints.
However, its fast, really really fast.
If you want to work around the duplicate key issue, and identify which rows are duplicates in a batch. One option is:
- start tran
- Grab a tablockx on the table select all current "Hash" values and chuck them in a HashSet.
- Filter out the duplicates and report.
- Insert the data
- commit tran
This process will work effectively if you are inserting huge sets and the size of the initial data in the table is not too huge.
Can you please expand your question to include the rest of the context of the problem.
EDIT
Now that I have some more context here is another way you can go about it:
- Do the bulk insert into a temp table.
- start serializable tran
- Select all temp rows that are already in the destination table ... report on them
- Insert the data in the temp table into the real table, performing a left join on hash and including all the new rows.
- commit the tran
That process is very light on round trips, and considering your specs should end up being really fast;
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…