Come richiamare in modo efficiente i parametri con valori di tabella da Ado.Net

ado.net bulkinsert sqlbulkcopy sql-server sql-server-2008

Domanda

Ho bisogno di inviare in modo efficiente decine di migliaia di numeri e date da Ado.Net a SQl Server 2008. In passato, prima di SQL 2008, stavo comprimendo quei numeri in un'immagine, che era piuttosto veloce. Erland Sommarskog è stato così gentile da includere parte del mio codice nel suo articolo Array ed elenchi in SQL Server 2005

Perché ora possiamo usare i TVP, li ho provati. Sul client, sto eseguendo questo:

        dataTable = new DataTable();
        dataTable.Columns.Add("Date", typeof(DateTime));
        dataTable.Columns.Add("Price", typeof(decimal));
        dataTable.Rows.Add(new object[] { someDate, somePrice });
            command.CommandText = "Writers.SavePrices";
            command.CommandType = CommandType.StoredProcedure;
            var param = command.Parameters.AddWithValue("@Prices", dataTable);
            param.SqlDbType = SqlDbType.Structured;

Questo codice funziona, ma non penso che sia efficiente. Ho attivato il Profiler e ho visto immediatamente che Ado.Net emette il seguente SQL altamente inefficiente inviato al server:

DECLARE @Prices TABLE(...)
INSERT INTO @Prices(...)VALUES(...)
EXEC Writers.SavePrices @Prices=@Prices

Di conseguenza, gran parte della larghezza di banda della rete e della CPU sul server vengono sprecate per l'invio, l'analisi e la compilazione. C'è un modo più efficiente di usare TVP con Ado.Net?

Risposta accettata

Conosci SqlBulkCopy ? È molto efficiente e flessibile. Ecco un esempio.

L'ho menzionato come alternativa a TVP. Vedi qui e qui per informazioni più interessanti su SQLBulkCopy rispetto a TVP.

(copiato dai commenti)



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché