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.