masiva insercion importar importacion guardar forma exportar exportacion ejemplos desde datos crear como carga archivo sql sql-server tsql bulkinsert

insercion - importar y exportar datos de forma masiva sql server



ImportaciĆ³n masiva de SQL desde CSV (13)

Necesito importar un gran archivo CSV en un servidor SQL. Estoy usando esto:

BULK INSERT CSVTest FROM ''c:/csvfile.txt'' WITH ( FIELDTERMINATOR = '','', ROWTERMINATOR = ''/n'' ) GO

El problema es que todos mis campos están rodeados por comillas ("") así que una fila realmente se ve así:

"1","","2","","sometimes with comma , inside", ""

¿Puedo, de alguna manera, importarlos a granel y decirle a SQL que use las comillas como delimitadores de campo?

Editar : El problema con el uso de ''","'' como delimitador, como en los ejemplos sugeridos es que: lo que hacen la mayoría de los ejemplos, es que importan los datos incluyendo el primero "en la primera columna y el último" en el último, luego ve y quítate eso. Por desgracia, mi primera (y última) columna son de fecha y hora y no permitirán que se importe un "20080902 como fecha y hora".

Por lo que he estado leyendo, creo que FORMATFILE es el camino a seguir, pero la documentación (incluida MSDN) es tremendamente inútil.


¿Necesitas hacer esto programáticamente, o es un disparo de una sola vez?

Con el Administrador corporativo, haga clic con el botón secundario en Importar datos para seleccionar su delimitador.


¿Tienes control sobre el formato de entrada? | (tuberías), y / t generalmente hacen mejores terminadores de campo.


Debe tener cuidado con BCP / BULK INSERT porque ni BSP ni Bulk Insert lo manejan bien si las citas no son consistentes, incluso con archivos de formato (incluso los archivos de formato XML no ofrecen la opción) y caracteres ficticios ["] en el principio y final y utilizando [","] como separador. Técnicamente, los archivos CSV no necesitan tener caracteres ["] si no hay caracteres incrustados [,]

Es por esta razón que los archivos delimitados por comas a veces se denominan archivos de comedia limitada.

OpenRowSet requerirá Excel en el servidor y podría ser problemático en entornos de 64 bits: sé que es problemático al usar Excel en Jet en 64 bits.

SSIS es realmente su mejor opción si el archivo es probable que varíe de sus expectativas en el futuro.


Pruebe OpenRowSet . Esto se puede usar para importar cosas de Excel. Excel puede abrir archivos CSV, por lo que solo necesita averiguar el [ConnectionString] correcto [2].

[2]: Driver = {Microsoft Text Driver (* .txt; * .csv)}; Dbq = c: / txtFilesFolder /; Extensiones = asc, csv, tab, txt;




También podría usar DTS o SSIS.


Sé que esta no es una solución real, pero utilizo una tabla ficticia para la importación con nvarchar configurado para todo. Luego hago una inserción que elimina los "caracteres y hace las conversiones. No es bonita, pero cumple su función.


Si descubres cómo descomprimir el archivo en una DataTable, te sugiero la clase SqlBulkInsert para insertarlo en SQL Server.


Otro truco que a veces uso es abrir el archivo CSV en Excel y luego escribir el enunciado SQL en una celda al final de cada fila. Por ejemplo:

=concatenate("insert into myTable (columnA,columnB) values (''",a1,"'',''",b1,"''")")

Un relleno puede llenarlo en cada fila. Luego solo copie y pegue el resultado en una nueva ventana de consulta.

Es de la vieja escuela, pero si solo tienes que hacer importaciones de vez en cuando, te ahorra perder el tiempo leyendo toda la oscura documentación sobre la forma "correcta" de hacerlo.


Id decir usar FileHelpers es una biblioteca de código abierto


Puedes probar este código, que es muy bueno si lo deseas, esto eliminará los puntos y comas no deseados de tu código. si, por ejemplo, sus datos son así:
"Kelly", "Reynold", "[email protected]"

Bulk insert test1 from ''c:/1.txt'' with ( fieldterminator =''","'' ,rowterminator=''/n'') update test1<br> set name =Substring (name , 2,len(name)) where name like **'' "% ''** update test1 set email=substring(email, 1,len(email)-1) where email like **'' %" ''**


Primero debes importar el archivo CSV a la Tabla de datos

Luego puede insertar filas masivas usando SQLBulkCopy

using System; using System.Data; using System.Data.SqlClient; namespace SqlBulkInsertExample { class Program { static void Main(string[] args) { DataTable prodSalesData = new DataTable("ProductSalesData"); // Create Column 1: SaleDate DataColumn dateColumn = new DataColumn(); dateColumn.DataType = Type.GetType("System.DateTime"); dateColumn.ColumnName = "SaleDate"; // Create Column 2: ProductName DataColumn productNameColumn = new DataColumn(); productNameColumn.ColumnName = "ProductName"; // Create Column 3: TotalSales DataColumn totalSalesColumn = new DataColumn(); totalSalesColumn.DataType = Type.GetType("System.Int32"); totalSalesColumn.ColumnName = "TotalSales"; // Add the columns to the ProductSalesData DataTable prodSalesData.Columns.Add(dateColumn); prodSalesData.Columns.Add(productNameColumn); prodSalesData.Columns.Add(totalSalesColumn); // Let''s populate the datatable with our stats. // You can add as many rows as you want here! // Create a new row DataRow dailyProductSalesRow = prodSalesData.NewRow(); dailyProductSalesRow["SaleDate"] = DateTime.Now.Date; dailyProductSalesRow["ProductName"] = "Nike"; dailyProductSalesRow["TotalSales"] = 10; // Add the row to the ProductSalesData DataTable prodSalesData.Rows.Add(dailyProductSalesRow); // Copy the DataTable to SQL Server using SqlBulkCopy using (SqlConnection dbConnection = new SqlConnection("Data Source=ProductHost;Initial Catalog=dbProduct;Integrated Security=SSPI;Connection Timeout=60;Min Pool Size=2;Max Pool Size=20;")) { dbConnection.Open(); using (SqlBulkCopy s = new SqlBulkCopy(dbConnection)) { s.DestinationTableName = prodSalesData.TableName; foreach (var column in prodSalesData.Columns) s.ColumnMappings.Add(column.ToString(), column.ToString()); s.WriteToServer(prodSalesData); } } } } }