Importar CSV a SQL Server
Dos de las formas más rápidas de importar datos es utilizar bcp o SqlBulkCopy. BCP es delicado y requiere una descarga por separado. Mi intención es crear un script que se pueda usar en cualquier máquina que ejecute PowerShell v3 y superior, por lo que estos scripts usarán SqlBulkCopy. El problema es que SqlBulkCopy.WriteToServer () requiere un Datatable, Datarow o IDataReader como entrada. Esto significa que sus datos CSV de texto sin formato deben transformarse en uno de estos objetos antes de pasarlos a WriteToServer ().
Probé tres métodos diferentes para transformar datos CSV en un objeto consumible.
El primer método utiliza lotes SqlBulkCopy, StreamReader y DataSet.
El segundo transmite un conjunto de resultados de consulta OleDbconnection a SqlBulkCopy.
El tercero usa lotes SqlBulkCopy, VisualBasic.FileIO.TextFieldParser y DataSet.
De hecho, también probé logparser, pero si bien logparser es increíble (y mucho más rápido) para analizar archivos, no aprovecha sqlbulkcopy, por lo que estos enfoques en realidad superan a logparser (y mis pruebas con SSIS para el caso).
Configuración
Mi laboratorio es un laboratorio virtualizado de VMWare que ahora consta de una máquina con Windows 10 con 6 GB de RAM y una instancia de SQL Server 2014 con 12 GB de RAM (8 dedicadas a SQL Server). Ambos están en el mismo host ESX que tiene una unidad SSD Samsung 850 EVO de 500 GB conectada directamente. El modelo de recuperación de la base de datos está configurado en SIMPLE.
El archivo CSV de 1,2 GB de este ejemplo contiene más de 10 millones de filas de datos de longitud y latitud delimitados por tabuladores. Un zip que contiene el CSV está disponible para descargar en geonames.org.
Primero, tuve que crear la tabla SQL.
CREATE TABLE allCountries ( GeoNameId int PRIMARY KEY, Name nvarchar(200), AsciiName nvarchar(200), AlternateNames nvarchar(max), Latitude float, Longitude float, FeatureClass char(1), FeatureCode varchar(10), CountryCode char(2), Cc2 varchar(255), Admin1Code varchar(20), Admin2Code varchar(80), Admin3Code varchar(20), Admin4Code varchar(20), Population bigint, Elevation varchar(255), Dem int, Timezone varchar(40), ModificationDate smalldatetime, )
Luego probé los distintos métodos. Probablemente notará que estos scripts no tienen mucho manejo de errores. Quería que el código fuera fácil de leer y sencillo. Scripts finalizados con manejo de errores y todo eso se colocará en ScriptCenter en breve.
Add comment