none
Importar Datos mediante BCP (Calificador de texto comillas) - SQL Server Express 2008 R2 RRS feed

  • Pregunta

  • Buenas tardes:

    Estoy tratando de realizar la importación de una tabla que está delimitada por ';' sin embargo los campos tienen " como calificador de texto, la idea es automatizar el proceso de carga, para tal motivo me armé un SCRIPT de carga y también el archivo de formato .fmt

    Format File:

    10.0
    30
    1       SQLNCHAR             0      250      "\";\""    1     actual                                   Modern_Spanish_CI_AS
    2       SQLNCHAR             0      250      "\";\""    2     cdg_barras                               Modern_Spanish_CI_AS
    3       SQLNCHAR             0      250      "\";\""    3     cdg_envio                                Modern_Spanish_CI_AS
    4       SQLNCHAR             0      250      "\";\""    4     cdg_envio_fin                            Modern_Spanish_CI_AS
    5       SQLNCHAR             0      250      "\";\""    5     cdg_pais                                 Modern_Spanish_CI_AS
    6       SQLNCHAR             0      250      "\";\""    6     cdg_prod                                 Modern_Spanish_CI_AS
    7       SQLNCHAR             0      250      "\";\""    7     cdg_proveedor                            Modern_Spanish_CI_AS
    8       SQLNCHAR             0      250      "\";\""    8     cdg_usu_cruce                            Modern_Spanish_CI_AS
    9       SQLNCHAR             0      250      "\";\""    9     clasi_fiscal                             Modern_Spanish_CI_AS
    10      SQLNCHAR             0      250      "\";\""    10    embalaje                                 Modern_Spanish_CI_AS
    11      SQLNCHAR             0      250      "\";\""    11    fabricante                               Modern_Spanish_CI_AS
    12      SQLNCHAR             0      250      "\";\""    12    fecha                                    Modern_Spanish_CI_AS
    13      SQLNCHAR             0      250      "\";\""    13    fecha_alta                               Modern_Spanish_CI_AS
    14      SQLNCHAR             0      250      "\";\""    14    fecha_cruce                              Modern_Spanish_CI_AS
    15      SQLNCHAR             0      250      "\";\""    15    fecha_fin_mov                            Modern_Spanish_CI_AS
    16      SQLNCHAR             0      250      "\";\""    16    fecha_inicio_mov                         Modern_Spanish_CI_AS
    17      SQLNCHAR             0      250      "\";\""    17    flag_cdg_barras                          Modern_Spanish_CI_AS
    18      SQLNCHAR             0      250      "\";\""    18    flag_confirm                             Modern_Spanish_CI_AS
    19      SQLNCHAR             0      250      "\";\""    19    flag_estado                              Modern_Spanish_CI_AS
    20      SQLNCHAR             0      250      "\";\""    20    flag_movim                               Modern_Spanish_CI_AS
    21      SQLNCHAR             0      250      "\";\""    21    flag_institucional                       Modern_Spanish_CI_AS
    22      SQLNCHAR             0      250      "\";\""    22    hora                                     Modern_Spanish_CI_AS
    23      SQLNCHAR             0      250      "\";\""    23    hora_cruce                               Modern_Spanish_CI_AS
    24      SQLNCHAR             0      250      "\";\""    24    id_cruce                                 Modern_Spanish_CI_AS
    25      SQLNCHAR             0      250      "\";\""    25    id_prod_unico                            Modern_Spanish_CI_AS
    26      SQLNCHAR             0      250      "\";\""    26    nom_prod                                 Modern_Spanish_CI_AS
    27      SQLNCHAR             0      250      "\";\""    27    nro_presen                               Modern_Spanish_CI_AS
    28      SQLNCHAR             0      250      "\";\""    28    precio_fabrica                           Modern_Spanish_CI_AS
    29      SQLNCHAR             0      250      "\";\""    29    tipo_prod                                Modern_Spanish_CI_AS
    30      SQLNCHAR             0      250      "\";\""    30    valido                                   Modern_Spanish_CI_AS


    Script:

    TRUNCATE TABLE [Base_Prueba_II].[dbo].[Prod_Prov]
    	BULK INSERT [Base_Prueba_II].[dbo].[Prod_Prov]
    		FROM 'C:\Users\mfrutos\Desktop\Prod_Prov\Prod_Prov.txt'
    			WITH 
    				(FORMATFILE = 'C:\Users\mfrutos\Desktop\Prod_Prov\format.fmt');

    Al ejecutar el script me salta el siguiente error:

    Msg 8152, Level 16, State 14, Line 2
    String or binary data would be truncated.
    The statement has been terminated.

    He leído bastante al respecto, y estoy seguro de que ninguno de los campos supera los 250 caracteres, si alguno me puede guiar estaría agradecido.

    saludos.

    Pd: Es la primera vez que hago una consulta, pido disculpas de antemano si me faltó algún dato o no me hice entender.



    jueves, 25 de agosto de 2016 20:37

Respuestas

  • Hola Marco Frutos

    El mensaje de error se muestra para la fila 2. Revisar qué aspecto estructural o de datos tiene diferente. El error informa a cerca de la diferencia de tamaño en una cadena que no puede introducirse completa.  Hay que revisar esa situación.

    Adicionalmente, para mayor información revise el siguiente enlace:

    https://msdn.microsoft.com/es-es/library/ms188365.aspx

    Saludos,


    Miguel Torres




    jueves, 25 de agosto de 2016 21:02
  • Saludos

    Estas mandado un varchar de 250 a uno de 50, piensa que sql al igual que casi cualquier lenguaje ve el tamaño del envase no del contenido y básicamente le estas diciendo que quieres pasar un embaze de 2lts en uno de 500ml, lo cual causa el error de arriba o limitas el tamaño de tu origen o aumentas el tamaño de tu tabla objetivo.

    A sql en este punto no le interesa si hay 5 caracteres o 250 caracteres el solo vera los data types y su tamaño.

    jueves, 25 de agosto de 2016 21:32
  • Hola Marco Frutos

    Revise el archivo que contiene los datos a importar con un editor de texto como Bloc de Notas y elimine cualquier línea que se encuentre incompleta o en blanco tanto al principio como al final del archivo.

    Si el archivo de formato lo ha creado con la utilidad BCP tenga cuidado de haber establecido el argumento -F first_row en el número de la línea correcto donde inician los datos a importar.

    También puede probar a cambiar el terminador de fila predeterminado \n para establecerlo en notación hexadecimal -r row_term  "0x0A" al usar la utilidad BCP. Eso es equivalente a establecer ROWTERMINATOR = '0x0A'.

    Saludos,


    Miguel Torres








    viernes, 26 de agosto de 2016 19:26

Todas las respuestas

  • Saludos

    No nos das la estructura de la tabla objetivo, seguramente al intentar insertar la tabla objetivo tiene tamaños menores a los cuales le estas mandando.

    jueves, 25 de agosto de 2016 20:51
  • Hola Marco Frutos

    El mensaje de error se muestra para la fila 2. Revisar qué aspecto estructural o de datos tiene diferente. El error informa a cerca de la diferencia de tamaño en una cadena que no puede introducirse completa.  Hay que revisar esa situación.

    Adicionalmente, para mayor información revise el siguiente enlace:

    https://msdn.microsoft.com/es-es/library/ms188365.aspx

    Saludos,


    Miguel Torres




    jueves, 25 de agosto de 2016 21:02
  • Enrique, buenas tardes:

    Gracias por la pronta respuesta, la estructura de la tabla es la siguiente:

    CREATE TABLE [dbo].[Prod_Prov](
    	[actual] [varchar](50) NULL,
    	[cdg_barras] [varchar](50) NULL,
    	[cdg_envio] [varchar](50) NULL,
    	[cdg_envio_fin] [varchar](50) NULL,
    	[cdg_pais] [varchar](50) NULL,
    	[cdg_prod] [varchar](50) NULL,
    	[cdg_proveedor] [varchar](50) NULL,
    	[cdg_usu_cruce] [varchar](50) NULL,
    	[clasi_fiscal] [varchar](50) NULL,
    	[embalaje] [varchar](50) NULL,
    	[fabricante] [varchar](170) NULL,
    	[fecha] [varchar](50) NULL,
    	[fecha_alta] [varchar](50) NULL,
    	[fecha_cruce] [varchar](50) NULL,
    	[fecha_fin_mov] [varchar](50) NULL,
    	[fecha_inicio_mov] [varchar](50) NULL,
    	[flag_cdg_barras] [varchar](50) NULL,
    	[flag_confirm] [varchar](50) NULL,
    	[flag_estado] [varchar](50) NULL,
    	[flag_movim] [varchar](50) NULL,
    	[hora] [varchar](50) NULL,
    	[hora_cruce] [varchar](50) NULL,
    	[id_cruce] [varchar](50) NULL,
    	[id_prod_unico] [varchar](50) NULL,
    	[nom_prod] [varchar](170) NULL,
    	[nro_presen] [varchar](50) NULL,
    	[precio_fabrica] [varchar](50) NULL,
    	[tipo_prod] [varchar](50) NULL,
    	[valido] [varchar](50) NULL
    Gracias y saludos.

    jueves, 25 de agosto de 2016 21:29
  • Saludos

    Estas mandado un varchar de 250 a uno de 50, piensa que sql al igual que casi cualquier lenguaje ve el tamaño del envase no del contenido y básicamente le estas diciendo que quieres pasar un embaze de 2lts en uno de 500ml, lo cual causa el error de arriba o limitas el tamaño de tu origen o aumentas el tamaño de tu tabla objetivo.

    A sql en este punto no le interesa si hay 5 caracteres o 250 caracteres el solo vera los data types y su tamaño.

    jueves, 25 de agosto de 2016 21:32
  • Hola Marco Frutos

    En el Archivo de Formato usted establece todos los campos con longitud de 250, mientras en la tabla usted tiene valores de 50 y 170 de longitud (fabricante y nom_prod)

    Saludos,


    Miguel Torres


    jueves, 25 de agosto de 2016 21:48
  • Miguel, buenas tardes:

    He corregido los errores de longitud de campo en la tabla de destino, sin embargo al ejecutar el script de carga ahora me salta el siguiente error:

    Msg 4832, Level 16, State 1, Line 2
    Bulk load: An unexpected end of file was encountered in the data file.
    Msg 7399, Level 16, State 1, Line 2
    The OLE DB provider "BULK" for linked server "(null)" reported an error. The provider did not give any information about the error.
    Msg 7330, Level 16, State 2, Line 2
    Cannot fetch a row from OLE DB provider "BULK" for linked server "(null)".

    Alguna recomendación? 


    Marco Frutos

    viernes, 26 de agosto de 2016 18:59
  • Hola Marco Frutos

    Revise el archivo que contiene los datos a importar con un editor de texto como Bloc de Notas y elimine cualquier línea que se encuentre incompleta o en blanco tanto al principio como al final del archivo.

    Si el archivo de formato lo ha creado con la utilidad BCP tenga cuidado de haber establecido el argumento -F first_row en el número de la línea correcto donde inician los datos a importar.

    También puede probar a cambiar el terminador de fila predeterminado \n para establecerlo en notación hexadecimal -r row_term  "0x0A" al usar la utilidad BCP. Eso es equivalente a establecer ROWTERMINATOR = '0x0A'.

    Saludos,


    Miguel Torres








    viernes, 26 de agosto de 2016 19:26
  • Gracias Miguel, haré las pruebas! 

    Marco Frutos

    viernes, 26 de agosto de 2016 19:56