Domanda

Sto cercando di eseguire un caricamento collettivo in un DB del server SQL. Il file sorgente ha duplicati che voglio rimuovere, quindi speravo che l'operazione caricasse automaticamente il primo, quindi scartasse il resto. (Ho impostato un vincolo chiave univoco). Il problema è che nel momento in cui viene tentato un caricamento duplicato, tutto fallisce e viene ripristinato. C'è un modo in cui posso semplicemente dire a SQL di andare avanti?

È stato utile?

Soluzione

Prova a inserire in blocco i dati nella tabella temporanea e quindi SELEZIONA DISTINCT come suggerito da @madcolor o

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

o altro campo nella clausola WHERE.

Altri suggerimenti

Se lo stai facendo tramite alcuni strumenti SQL come SQL Plus o DBVis o Toad, allora sospetto di no. Se lo stai facendo programmaticamente in una lingua, devi dividere e conquistare. Presumibilmente eseguire un aggiornamento riga per riga e rilevare ogni eccezione sarebbe un processo troppo lungo, quindi invece potresti fare prima un'operazione batch sull'intero blocco SQL e, se fallisce, farlo sul primo tempo e, se fallisce, fallo nella prima metà del primo tempo. Scorrere in questo modo fino a quando non si ottiene un blocco riuscito. Scarta il blocco ed esegui la stessa procedura sul resto dell'SQL. Tutto ciò che viola un vincolo finirà per essere una sola istruzione SQL che si sa di registrare e scartare. Questo dovrebbe essere importato con la maggior quantità possibile di elaborazione in blocco eliminando comunque le righe non valide.

Usa SSIS per questo. Puoi dirlo per saltare i duplicati. Ma prima assicurati che siano veri duplicati. Cosa succede se i dati in alcune colonne sono diversi, come fai a sapere qual è il record migliore da conservare?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top