2012-08-29 15 views
9

Estoy familiarizado con la clase C# SqlBulkCopy donde puede llamar al método 'WriteToServer' que pasa a través de una DataTable.¿Cómo funciona SqlBulkCopy?

Mi pregunta es qué mecanismo subyacente en el servidor SQL se utiliza para insertar a granel esos datos?

La razón por la que pregunto es que la inserción masiva a la que se hace referencia en el archivo de ayuda Bulk Insert MSDN T-SQL requiere un archivo de datos para importar. ¿SqlBulkCopy crea un archivo de datos?

Me gustaría entender esto para determinar si puedo usar la funcionalidad de inserción masiva en SQL.

Si escribo una declaración SQL que prepara todas las filas para insertar en una tabla particular (miles de filas) ¿puedo insertarlas a granel en la tabla de destino? Algo así es como lo estoy haciendo ahora,

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

Y los dbo.sync_contract_filters es una función para generar todas las filas a insertar. ¿Se puede insertar a granel?

Respuesta

8

SqlBulkCopy no crea un archivo de datos. Transmite la tabla de datos directamente desde el objeto .Net DataTable al servidor utilizando el protocolo de comunicación disponible (Canalizaciones con nombre, TCP/IP, etc.) e inserta los datos en la tabla de destino a granel utilizando la misma técnica utilizada por BCP .

+0

Entonces, algo de lo que estoy interesado además es ¿puedo crear una declaración SQL que cree las filas que necesito para una tabla en particular, y luego insertarlas a granel (esto es completamente usando SQL). ¿BCP puede hacer esto, por ejemplo? Tenía la impresión de que bcp usa tablas también. – peter

2

SqlBulkCopy puede usar una tabla de datos, IDataReader o DataRow [] como fuente de datos. Eche un vistazo a los métodos WriteToServer de la clase. Descubrí que es un mecanismo bastante útil para obtener datos en SQL Server. Lo he usado junto con CSVReader anteriormente. El enlace anterior le da una idea de cómo funciona con una clase que implementa IDataReader.

Es posible que necesite play around with the batch sizes para asegurarse de obtener el rendimiento que espera.

The Data Loading Performance Guide en MSDN es un recurso bastante útil si está buscando obtener el mejor rendimiento al escribir grandes cantidades de datos rápidamente. Se enfoca más en cosas como BCP y BULK INSERT, pero toca SQLBulkCopy y también proporciona un montón de ideas para pensar (quizás un poco demasiado, pero al menos es una referencia útil).

Cuestiones relacionadas