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;
Pruebe FIELDTERMINATOR=''","''
Aquí hay un gran enlace para ayudar con la primera y última cita ... mire cómo usó la subcadena SP
http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file
Sí, K Richard tiene razón: FIELDTERMINATOR = ''","''
Consulte http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file para obtener más información.
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);
}
}
}
}
}