Recibo un archivo XML diario que contiene miles de registros, cada uno de ellos es una transacción comercial que necesito almacenar en una base de datos interna para usar en informes y facturación . Tenía la impresión de que el archivo de cada día contenía solo registros únicos, pero descubrí que mi definición de único no es exactamente la misma que la del proveedor.Cómo evitar que se inserten registros duplicados con SqlBulkCopy cuando no hay clave principal
La aplicación actual que importa estos datos es una aplicación de consola C# .Net 3.5, lo hace usando SqlBulkCopy en una tabla de base de datos MS SQL Server 2008 donde las columnas coinciden exactamente con la estructura de los registros XML. Cada registro tiene un poco más de 100 campos, y no hay una clave natural en los datos, o mejor dicho, los campos que se me ocurren tienen sentido ya que una clave compuesta también tiene que permitir valores nulos. Actualmente, la tabla tiene varios índices, pero no una clave principal.
Básicamente, toda la fila debe ser única. Si un campo es diferente, es lo suficientemente válido para ser insertado. Consideré la creación de un hash MD5 de toda la fila, insertando eso en la base de datos y usando una restricción para evitar que SqlBulkCopy inserte la fila, pero no veo cómo poner el MD5 Hash en la operación BulkCopy y no estoy seguro si toda la operación fallaría y retrocedería si fallara un registro, o si continuaría.
El archivo contiene una gran cantidad de registros, yendo fila por fila en el XML, consultar la base de datos para un registro que coincida con todos los campos y luego decidir insertar es realmente la única forma que puedo ver de poder hacer esta. Solo esperaba no tener que volver a escribir la aplicación por completo, y la operación de copia masiva es mucho más rápida.
¿Alguien sabe de una manera de usar SqlBulkCopy mientras previene las filas duplicadas, sin una clave principal? O cualquier sugerencia para una forma diferente de hacer esto?
Además, no agregue índices a su tabla de etapas hasta después de la importación masiva (es más rápido) – CResults
@CResults: sí, debería haber mencionado que ... – gbn
Bueno, eso definitivamente tiene sentido y es fácil de implementar. Gracias. – kscott