Problema de terminador de campo en archivos de formato

Tengo un archivo de datos en formato txt y solía cargarlo con Bulk Insert en el siguiente comando:

Bulk insert [table1] FROM "data.txt" WITH ( FIELDTERMINATOR ="|", ROWTERMINATOR ="0x0a", ) 

El código funciona bien. Sin embargo, mientras intentaba usar un archivo de formato con la inserción masiva para cargar el archivo, encontré algunos problemas al especificar el terminador de campo para la última fila.

Aquí está la especificación para la última fila en el archivo de formato:

21 SQLCHAR 0 20 "0x0a" 21 misc_costs SQL_Latin1_General_CP1_CI_AS 

Con «0x0a» como terminador, obtengo el siguiente error:

Error de conversión de datos de carga masiva (truncamiento) para la fila 2, columna 1 (var1).

Con «\ n», los datos pueden ser cargado, pero «|» también se carga en la última columna. Por ejemplo, obtengo «0.5 |» en lugar de «0.5».

«| \ n», «0x0a», «| 0x0a», «\ r \ n» devuelve el mismo error que «|»

Error de conversión de datos de carga masiva (truncamiento) para la fila 2, columna 1 (var1).

I » m usando sql-server 2016, windows 10 de 64 bits.

¿Alguien puede ayudar con esto? ¡Gracias de antemano por su ayuda!

Jason

Comentarios

  • Ya que ' ha hecho algunas preguntas al respecto ahora, eche un vistazo a esta página: sommarskog.se/bulkload.html
  • @sp_BlitzErik, ¡gracias por su respuesta! Ese artículo es muy útil y proporciona mucha más información que el sitio de MSDN. Mientras lee el ejemplo en 4.1 , Me confundí con el terminador de campo " \ " \ r \ n ", la cita es una nota realmente completa, ¿es un tipo?
  • Si recuerdo correctamente, es ' una secuencia de escape. ding there ' una mejor explicación más abajo.

Respuesta

Después de todo un día luchando con el código Line Feed / Hex, finalmente descubrí que mi problema se debía a que faltaban columnas en los archivos de formato. El conjunto de datos es nuevo para mí y pensé que tenía 21 filas, mientras que en realidad tiene 22 filas. Es por eso que el servidor sql seguía cargando el último «|» del archivo de datos.

Aquí hay una referencia para otros que tal vez estén interesados en cargar el archivo de datos desde el sistema UNIX con terminadores de fila diferentes de Windows, hay tres métodos:

  1. use inserción masiva y configure el terminador de fila como «0x0a».
  2. use un archivo de formato y configure el terminador de campo del último campo como «\ n «.
  3. Use un sql dinámico con la función Char (10) para insertar el salto de línea (LF) en la cadena de comando y luego ejecute () la cadena de comando.

Antes de probar estos métodos, use un bloc de notas para mostrar todos los caracteres de control para confirmar los caracteres de control utilizados por los archivos de texto.

Si ninguno de estos métodos funciona para usted, es posible que tenga algunos problemas además de la línea terminador de alimentación / fila.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *