2016-01-08 21 views
9

Stiamo importando un file CSV con CSVReader quindi utilizzando SqlBulkCopy per inserire tali dati in SQL Server. Questo codice funziona per noi ed è molto semplice, ma ci chiediamo se esiste un metodo più veloce (alcuni dei nostri file hanno 100000 righe) che non risulterebbero troppo complessi?Modo rapido e semplice per importare CSV su SQL Server

 SqlConnection conn = new SqlConnection(connectionString); 
     conn.Open(); 
     SqlTransaction transaction = conn.BeginTransaction(); 
     try 
     { 
      using (TextReader reader = File.OpenText(sourceFileLocation)) 
      { 
       CsvReader csv = new CsvReader(reader, true); 
       SqlBulkCopy copy = new SqlBulkCopy(conn, SqlBulkCopyOptions.KeepIdentity, transaction); 
       copy.DestinationTableName = reportType.ToString(); 
       copy.WriteToServer(csv); 
       transaction.Commit(); 
      } 
     } 
     catch (Exception ex) 
     { 
      transaction.Rollback(); 
      success = false; 
      SendFileImportErrorEmail(Path.GetFileName(sourceFileLocation), ex.Message); 
     } 
     finally 
     { 
      conn.Close(); 
     } 
+1

Dubito che troverete qualcosa più veloce di questo. Quanto tempo ci vuole ora? Quanto tempo ti aspetti che prenda? –

+0

4 minuti con un file CSV con 180.000 righe come dati di test. Rispetto a 1,5 minuti con SSIS, che preferiremmo non utilizzare. –

+0

Se le prestazioni sono critiche nello scenario di integrazione, raccomanderei SSIS anche se ha dei nodi ... Su SQL Server 2012+ è anche possibile sviluppare SSDT tramite Visual Studio. –

risposta

3

Invece di costruire il proprio strumento per fare questo, uno sguardo ai SQL Server Import and Export/SSIS. È possibile indirizzare direttamente file flat e database SQL Server. Il pacchetto dtsx di output può anche essere eseguito dalla riga di comando o come lavoro tramite SQL Server Agent.

Il motivo che sto suggerendo è perché la procedura guidata è ottimizzata per il parallelismo e funziona davvero bene su file flat di grandi dimensioni.

+0

Grazie. Questo funzionerebbe come un processo automatico? –

+0

Sì, è possibile, ad esempio, pianificare il pacchetto in SQL Server come lavoro/attività. In genere inizio con la procedura guidata e quindi modifica il pacchetto in BIDS/SSDT a seconda della versione di SQL Server (vedere il mio commento sulla domanda originale). –

1

È consigliabile prendere in considerazione l'uso di un parametro con valori di tabella (TVP), basato su un tipo di tabella definito dall'utente (UDTT). Questa funzionalità è stata introdotta in SQL Server 2008 e consente di definire una struttura fortemente tipizzata che può essere utilizzata per lo streaming di dati in SQL Server (se eseguita correttamente). Un vantaggio di questo approccio rispetto all'utilizzo di SqlBulkCopy è che è possibile eseguire più di un semplice INSERT in una tabella; puoi fare qualsiasi logica tu voglia (validare/upsert/etc) poiché i dati arrivano sotto forma di una variabile di tabella. È possibile gestire tutta la logica di importazione in una singola stored procedure che può facilmente utilizzare le tabelle temporanee locali se prima è necessario eseguire uno qualsiasi dei dati. Ciò rende piuttosto semplice isolare il processo in modo tale da poter eseguire più istanze contemporaneamente purché sia ​​possibile separare logicamente le righe da importare.

Ho postato una risposta dettagliata su questo argomento qui su S.O. qualche tempo fa, tra cui codice di esempio e collegamenti ad altre informazioni:

How can I insert 10 million records in the shortest time possible?

C'è anche un link ad una risposta correlata di mine che mostra un'altra variazione su quel tema. Ho una terza risposta da qualche parte che mostra un approccio in batch se hai milioni di righe, cosa che non fai, ma non appena troverò che aggiungerò il link qui.

Problemi correlati