Inserción masiva desde el file CSV – omite duplicates

ACTUALIZACIÓN: Terminó usando este método creado por Johnny Bubriski y luego lo modificó un poco para omitir los duplicates. Funciona como un encanto y aparentemente es bastante rápido. Enlace: http://johnnycode.com/2013/08/19/using-c-sharp-sqlbulkcopy-to-import-csv-data-sql-server/

He estado buscando una respuesta a esto, pero parece que no puedo encontrarlo. Estoy haciendo una inserción masiva de T-SQL para cargar datos en una tabla en una database local desde un file csv. Mi statement se ve así:

BULK INSERT Orders FROM 'csvfile.csv' WITH(FIELDTERMINATOR = ';', ROWTERMINATOR = '0x0a', FORMATFILE = 'formatfile.fmt', ERRORFILE = 'C:\\ProgramData\\Tools_TextileMagazine\\AdditionalFiles\\BulkInsertErrors.txt') GO SELECT * FROM Orders GO 

Obtengo una exception cuando trato de insert filas duplicadas (por ejemplo, tomar el mismo file csv dos veces), lo que hace que la inserción completa se detenga y se vuelva a deshacer. Comprensible ya que estoy violando la restricción de la key principal. En este momento solo muestro un cuadro de post para que los usuarios sepan que hay duplicates en el file csv, pero esta no es una solución adecuada, en realidad no es una solución en absoluto. Mi pregunta es, ¿hay alguna forma de ignorar estas filas duplicadas y simplemente omitirlas y solo agregar las filas que no están duplicadas? Tal vez en un bash de atrapar de alguna manera?

Si no es posible, ¿cuál sería la forma "correcta" (a falta de una palabra mejor) de importar datos desde el file csv? La exception me está causando algunos problemas. Leí en alguna parte que puede configurar una tabla temporal, cargar los datos en ella y seleccionar distintos entre las dos tablas antes de insert. ¿Pero realmente no hay una manera más fácil de hacerlo con la inserción masiva?

Puede establecer la propiedad MAXERRORS a un nivel bastante alto que permita insert los loggings válidos y MAXERRORS los duplicates. Desafortunadamente, esto significará que cualquier otro error en el set de datos no causará la falla de la carga.

Alternativamente, puede establecer la propiedad BATCHSIZE que cargará los datos en múltiples transactions, por lo tanto, si hay duplicates, solo retrotraerá el lote.

Una manera más segura, pero less eficiente, sería cargar el file CSV en una tabla separada, vacía, y luego combinarlos en su tabla de pedidos como usted mencionó. Personalmente, esta es la forma en que lo haría.

Ninguna de estas soluciones es ideal, pero no puedo pensar en una forma de ignorar los duplicates en la syntax de inserción masiva.