2012-08-29 1 views
9

Ho familiarità con la classe C# SqlBulkCopy in cui è possibile chiamare il metodo 'WriteToServer' che passa attraverso un DataTable.Come funziona SqlBulkCopy

La mia domanda è quale meccanismo di base in SQL Server viene utilizzato per inserire in gruppo tali dati?

La ragione per cui chiedo è che l'inserto di massa di riferimento nel file di guida MSDN T-SQL Bulk Insert richiede un file di dati da importare. SqlBulkCopy crea un file di dati?

Mi piacerebbe capire questa roba per capire se posso usare la funzionalità di inserimento di massa in SQL.

Se scrivo un'istruzione SQL che prepara tutte le righe da inserire in una tabella particolare (migliaia di righe) posso inserirle in massa nella tabella di destinazione? Qualcosa di simile è come sto facendo ora,

INSERT INTO sync_filters (table_name, device_id, road_id, contract_id) 
    SELECT * FROM dbo.sync_contract_filters (@device_id) 

E i dbo.sync_contract_filters è una funzione per generare tutte le righe da inserire. Può essere inserito alla rinfusa?

risposta

8

SqlBulkCopy non crea un file di dati. Trasmette la tabella di dati direttamente dall'oggetto .Net DataTable al server utilizzando il protocollo di comunicazione disponibile (Named Pipes, TCP/IP, ecc.) E inserisce i dati nella tabella di destinazione in blocco utilizzando la stessa tecnica utilizzata da BCP .

+0

Quindi una cosa che mi interessa in aggiunta è la possibilità di creare un'istruzione SQL che creerà le righe necessarie per una determinata tabella, quindi inserirle in serie (questo è completamente utilizzando SQL). Ad esempio, può farlo BCP? Ho avuto l'impressione che bcp usi anche le tabelle. – peter

2

SqlBulkCopy può utilizzare datatable, IDataReader o DataRow [] come origine dati. Dai un'occhiata ai metodi WriteToServer della classe. Ho trovato che è un meccanismo abbastanza utile per ottenere dati in SQL Server. L'ho usato in combinazione con CSVReader in precedenza. Il link precedente ti dà un'idea di come funziona con una classe che implementa IDataReader.

Potrebbe essere necessario play around with the batch sizes per assicurarsi di ottenere le prestazioni che si aspettano.

The Data Loading Performance Guide su MSDN è una risorsa piuttosto utile se si sta cercando di ottenere le migliori prestazioni dalla scrittura di grandi quantità di dati rapidamente. Si concentra maggiormente su cose come BCP e BULK INSERT, ma tocca SQLBulkCopy e fornisce anche un sacco di spunti di riflessione (forse un po 'troppo, ma è comunque un utile riferimento almeno).