sql-server - importar - habilitar bulk insert sql server
Bulk Insertar archivo CSV correctamente citado en SQL Server (9)
Estoy intentando importar un archivo CSV cotizado correctamente, lo que significa que los datos solo se citan si contienen una coma, por ejemplo:
41, Terminator, Black
42, "Monsters, Inc.", Blue
Observé que la primera fila importa correctamente, pero los errores de la segunda fila de una manera que sugiere que la coma citada se trató como un separador de campo.
He visto sugerencias como esta
Importación masiva de SQL desde CSV
para cambiar el terminador de campo
FIELDTERMINATOR = ''","''
Sin embargo, mi archivo CSV solo cita campos que lo necesitan, así que no creo que esa sugerencia funcione.
¿Puede la instrucción BULK IMPORT de SQL Server importar un archivo CSV cotizado correctamente? ¿Cómo?
Asegúrate de haber habilitado la opción TextQualified y configurarla para que sea "
.
Desafortunadamente SQL Server interpreta la coma entre comillas como un delimitador. Esto se aplica tanto a BCP como a la inserción masiva.
De http://msdn.microsoft.com/en-us/library/ms191485%28v=sql.100%29.aspx
Si se produce un carácter de terminador dentro de los datos, se interpreta como un terminador, no como datos, y los datos posteriores a ese carácter se interpretan como pertenecientes al siguiente campo o registro. Por lo tanto, elija sus terminadores cuidadosamente para asegurarse de que nunca aparezcan en sus datos.
Hay otra solución para esto.
Considere las citas como parte del delimitador de campos, editando el archivo fmt.
Puede consultar esto para obtener más información:
Un extracto del enlace de arriba:
La única forma de eliminar las comillas sería modificar los delimitadores de columna especificados durante la operación de importación. El único inconveniente aquí es que si inspecciona los datos que se van a insertar, rápidamente se dará cuenta de que los delimitadores de columna son diferentes para cada columna (delimitadores resaltados anteriormente).
Por lo tanto, para especificar diferentes delimitadores de columna para cada columna, necesitaría usar un archivo de formato si planea usar Bulk Insert o BCP. Si genera un archivo de formato para la estructura de tabla anterior, sería el siguiente:
9.0
3
1 SQLCHAR 0 5 "/t" 1 FName SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 5 "/t" 2 LName SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 50 "/r/n" 3 Company SQL_Latin1_General_CP1_CI_AS
Modifique el archivo de formato para representar los delimitadores de columna correctos para cada columna. El nuevo archivo de formato que se utilizará se verá así:
9.0
4
1 SQLCHAR 0 0 "/"" 0 FIRST_QUOTE SQL_Latin1_General_CP1_CI_AS
2 SQLCHAR 0 5 "/",/"" 1 FNAME SQL_Latin1_General_CP1_CI_AS
3 SQLCHAR 0 5 "/",/"" 2 LNAME SQL_Latin1_General_CP1_CI_AS
4 SQLCHAR 0 50 "/"/r/n" 3 COMPANY SQL_Latin1_General_CP1_CI_AS
He pasado medio día en este problema. Lo mejor es importar utilizando el asistente de datos de importación y exportación de SQL Server. Hay una configuración en ese asistente que resuelve este problema. Capturas de pantalla detalladas aquí: https://www.mssqltips.com/sqlservertip/1316/strip-double-quotes-from-an-import-file-in-integration-services-ssis/ Gracias
Sé que este es un tema antiguo, pero esta característica ya se implementó desde SQL Server 2017. El parámetro que está buscando es FIELDQUOTE = que tiene el valor predeterminado '''' ''''. Consulte más en https://docs.microsoft.com/en-us/sql/t-sql/statements/bulk-insert-transact-sql?view=sql-server-2017
Según la especificación de formato CSV, no creo que importe si los datos se citan correctamente o no, siempre que cumplan con las especificaciones. El analizador debe manejar las comillas excesivas si se implementan correctamente. FIELDTERMINATOR
debe ser una coma y ROWTERMINATOR
es el final de línea; esto denota un archivo CSV estándar. ¿Intentó importar sus datos con esta configuración?
También puede ver usar OpenRowSet con el proveedor de datos de archivo de texto CSV.
Esto debería ser posible con cualquier versión de SQL Server> = 2005 aunque necesite habilitar la característica.
Tuve el mismo problema, con datos que solo ocasionalmente contrabandean texto. Mi solución es dejar que BULK LOAD importe las comillas dobles, luego ejecute un REEMPLAZO en los datos importados.
Por ejemplo:
insertar en masa CodePoint_tbl desde "F: / Data / Map / CodePointOpen / Data / CSV / ab.csv" con (FIRSTROW = 1, FIELDTERMINATOR = '','', ROWTERMINATOR = ''/ n'');
actualizar CodePoint_tbl set Código postal = reemplazar (Código postal, ''"'', '''') donde charindex (''"'', Código postal)> 0
Para que sea menos doloroso escribir el script REEMPLAZAR, simplemente copie y pegue lo que necesita de los resultados de algo como esto:
select C.ColID, C.[name] as Columnname into #Columns
from syscolumns C
join sysobjects T on C.id = T.id
where T.[name] = ''User_tbl''
order by 1;
declare @QUOTE char(1);
set @QUOTE = Char(39);
select ''Update User_tbl set ''+ColumnName+''=replace(''+ColumnName+'',''
+ @QUOTE + ''"'' + @QUOTE + '','' + @QUOTE + @QUOTE + '');
GO''
from #Columns
where ColID > 2
order by ColID;
Tuve el mismo problema, y no quería tener que seguir la ruta de SSIS, así que encontré un script de PowerShell que es fácil de ejecutar y maneja el caso de las comillas con la coma en ese campo en particular:
Código fuente y DLL para el script de PowerShell: https://github.com/billgraziano/CsvDataReader
Aquí hay un blog que explica el uso: http://www.sqlteam.com/article/fast-csv-import-in-powershell-to-sql-server