Pregunta

Estoy intentando hacer una carga masiva en una base de datos del servidor SQL. El archivo fuente tiene duplicados que quiero eliminar, por lo que esperaba que la operación cargara automáticamente el primero y luego descartara el resto. (He establecido una restricción de clave única). El problema es que, en el momento en que se intenta una carga duplicada, todo falla y se revierte. ¿Hay alguna forma de decirle a SQL que continúe?

¿Fue útil?

Solución

Intente insertar masivamente los datos en la tabla temporal y luego SELECCIONE DISTINCT como @madcolor sugirió o

INSERT INTO yourTable
SELECT * FROM #tempTable tt
WHERE NOT EXISTS (SELECT 1 FROM youTable yt WHERE yt.id = tt.id)

u otro campo en la cláusula WHERE.

Otros consejos

Si está haciendo esto a través de alguna herramienta SQL como SQL Plus o DBVis o Toad, entonces sospecho que no. Si está haciendo esto programáticamente en un idioma, entonces necesita dividir y conquistar. Presumiblemente, ejecutar una actualización línea por línea y atrapar cada excepción sería un proceso demasiado largo, por lo que podría hacer una operación por lotes primero en todo el bloque SQL, y si falla, hágalo en la primera mitad, y si eso falla, hazlo en la primera mitad de la primera mitad. Itere de esta manera hasta que tenga un bloqueo que tenga éxito. Deseche el bloque y realice el mismo procedimiento en el resto del SQL. Cualquier cosa que viole una restricción eventualmente terminará como una única declaración SQL que debe registrar y descartar. Esto debería importarse con el mayor procesamiento masivo posible mientras se descartan las líneas no válidas.

Use SSIS para esto. Puede decirle que omita los duplicados. Pero primero asegúrese de que sean verdaderos duplicados. ¿Qué sucede si los datos en algunas de las columnas son diferentes, cómo sabe cuál es el mejor registro para mantener?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top