Cómo invocar de manera eficiente los parámetros con valores de tabla de Ado.Net

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

Pregunta

Necesito enviar de manera eficiente decenas de miles de números y fechas desde Ado.Net a SQl Server 2008. En los días anteriores a SQL 2008, estaba empaquetando esos números en una imagen, lo cual fue bastante rápido. Erland Sommarskog tuvo la amabilidad de incluir parte de mi código en su artículo Arrays and Lists en SQL Server 2005

Porque ahora podemos usar TVPs, los probé. En el cliente, estoy ejecutando esto:

        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;

Este código funciona, pero no creo que sea eficiente. Encendí el Perfilador e inmediatamente vi que Ado.Net emite el siguiente SQL altamente ineficiente que se envía al servidor:

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

Como resultado, una gran cantidad de ancho de banda de red y CPU en el servidor se desperdicia en el envío, análisis y compilación. ¿Hay una manera más eficiente de usar TVP con Ado.Net?

Respuesta aceptada

¿Conoces SqlBulkCopy ? Es muy eficiente y flexible. Aquí hay un ejemplo.

Lo mencioné como una alternativa a TVP. Vea aquí y aquí para obtener más información interesante sobre SQLBulkCopy en comparación con TVP.

(Copiado de los comentarios)



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué