txt importar habilitar example ejemplos codepage archivo sql-server csv bulkinsert

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:

http://blogs.msdn.com/b/sqlserverfaq/archive/2010/02/04/how-to-remove-unwanted-quotation-marks-while-importing-a-data-file.aspx

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




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?



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;