queryout fmt fieldterminator codepage archivo sql-server sql-server-2008-r2

sql-server - fmt - sql server bulk copy



La inserciĆ³n a granel incluye Line Terminator (1)

Estoy importando datos a gran escala desde un archivo CSV separado por tubería en SQL Server. Los datos están formateados como

A | B | CCCCCC / r / n

He validado tanto que el archivo está en formato UTF-8 y que las líneas terminan con "/ r / n" al ver el archivo CSV en un editor hexadecimal.

El comando es

BULK INSERT MyTable FROM ''C:/Path/File.csv'' WITH (FIRSTROW=1, MAXERRORS=0, BATCHSIZE=10000, FIELDTERMINATOR = ''|'', ROWTERMINATOR = ''/r/n'')

La tercera columna originalmente se definió como CHAR (6) ya que este campo siempre es un código con exactamente 6 caracteres (ASCII) de ancho. Eso resultó en un error de truncamiento durante la inserción masiva.

Luego amplié la columna a CHAR (8). La importación funcionó, pero

SELECT CAST(Col3 As VARBINARY(MAX))

indica que los datos de columna terminan con 0x0D0A (o "/ r / n", el terminador de fila)

¿Por qué se incluye el terminador de fila en los datos importados y cómo puedo solucionarlo?


Para abreviar, SQL Server no es compatible con UTF-8 y solo necesita /n como el terminador de fila.

En realidad, no está claro qué sucede porque no proporcionó la definición de la tabla o los mensajes de error precisos. Habiendo dicho todo eso, podría cargar los siguientes datos:

create table dbo.BCPTest ( col1 nchar(1) not null, col2 nchar(1) not null, col3 nchar(6) not null ) /* This data can saved as ASCII, UTF-16 with BOM or UTF-8 without BOM (see comments below) A|B|CCCCCC D|E|FFFFFF */ BULK INSERT dbo.BCPTest FROM ''c:/testfile.csv'' WITH (FIELDTERMINATOR = ''|'', ROWTERMINATOR = ''/n'')

Comentarios:

  • Cuando creé y guardé un Bloc de notas como "UTF-8", se agregaron los bytes BOM 0xEFBBBF, que es el estándar UTF-8 BOM
  • Pero, SQL Server no es compatible con UTF-8, es compatible con UTF-16 (documentos oficiales aquí ) y espera una lista de materiales de 0xFFFE
  • Así que guardé el archivo nuevamente en el Bloc de notas como "Unicode", y se agregó el 0xFFFE BOM; esta bien cargada como se muestra arriba. Por curiosidad también lo guardé (usando Notepad ++) como "UTF-8 sin BOM" y pude cargar ese archivo también
  • Guardar el archivo como ASCII también se carga bien con los mismos tipos de datos de tabla y el comando BULK INSERT
  • El terminador de fila debe /n no /r/n porque /n se interpreta como una "nueva línea" , es decir, SQL Server (y / o Windows) está siendo ''inteligente'' al interpretar /n semánticamente en lugar de literalmente. Esto es muy probablemente un resultado del manejo de C de /r /n , que no requiere que se interpreten literalmente.