none
Error al insertar Mens 8152, Nivel 16, Estado 14 RRS feed

  • Pregunta

  • Hola a todos.

    Me encuentro realizando un SP el cual toma una archivo csv se carga a una tabla TMP y de acuerdo a los registros informados en el archivo realizo la insercion  y me está sucediendo lo siguiente:

    Cuando ejecuto el SP me está arrojando el siguiente error:

    Mens 8152, Nivel 16, Estado 14, Procedimiento SUIC_Migracion, Línea 84

    Los datos de cadena o binarios se truncarían.
    Se terminó la instrucción.

    Ya revisé la estructura y la definición de los campos a insertar y están bien definidos.

    La linea 84 a la que hacen mención es la siguiente en el código del SP:

    I_BOTON_HABILITADO             = replace(I_BOTON_HABILITADO,'"', ''),

    A continuación les comparto de como lo estoy haciendo, para que por fa me colaboren indicándome que ando haciendo mal.

    ALTER PROCEDURE [dbo].[SUIC_Migracion]
    -- Add the parameters for the stored procedure here
    AS
    BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    -- Se crea tabla temporal en la cual se almacenara la data a migrar
    create table #ImportSUIC 

    D_CODIGO                            VARCHAR(20),
    R_PLACA VARCHAR(20),                
    R_ID_ROM VARCHAR(20),            
    D_NIT_DISTRIBUIDOR       VARCHAR(15),      
    D_NIT_TALLER_CONV VARCHAR(20),        
    D_NIT_CERTIFICADOR VARCHAR(20),      
    F_FECHA_ULTIMA_REVISION VARCHAR(20),        
    F_FECHA_PROXIMA_REVISION VARCHAR(20),      
    R_CIUDAD                        VARCHAR(15), 
    D_NOMBRE_ORACLE_USER           VARCHAR(20),  
    F_FECHA_INGRESA_ORACLE           VARCHAR(50),        
    I_RECERTIFICACION               VARCHAR(20),       
    N_MES_REPORTE                   VARCHAR(15),             
    D_NOMBRE_ARCHIVO               VARCHAR(200),     
    I_ACTUALIZO_VEHICULO           VARCHAR(10),   
    N_NUMERO_LINEA                   VARCHAR(12),          
    F_FECHA_CERTIFICACION_INICIAL   VARCHAR(50),  
    I_BOTON_HABILITADO               VARCHAR(10),    
    D_USUARIO_INGRESA_DATOS           VARCHAR(100)
        

    ); 

    -- Se especifica la ruta en la cual se encuentra el archivo .csv que contiene la data a migrar
    Declare @path varchar (100) 
    set @path='C:\Users\opertuzo\Documents\Proyectos\everilion GNF\ARC/cargueSUIC1.csv'

    exec(' BULK INSERT #ImportSUIC 
    FROM ''' + @path +''' 
    WITH 
           ( 
                    FIRSTROW = 2,
    ROWTERMINATOR =''\r'',
                    FIELDTERMINATOR = '',''

            ) 
    ') 

    -- Se realiza tratamiento para que los datos a insertar en la tabla
    -- no se inserten con ""
    update #ImportSUIC
    Set R_PLACA                        = replace(R_PLACA,'"', ''),
        R_ID_ROM                       = replace(R_ID_ROM,'"', ''),
    D_NIT_DISTRIBUIDOR             = replace(D_NIT_DISTRIBUIDOR,'"', ''),
    D_NIT_TALLER_CONV              = replace(D_NIT_TALLER_CONV,'"', ''),
    D_NIT_CERTIFICADOR             = replace(D_NIT_CERTIFICADOR,'"', ''),
    F_FECHA_CERTIFICACION_INICIAL  = replace(F_FECHA_CERTIFICACION_INICIAL,'"', ''),
    F_FECHA_ULTIMA_REVISION        = replace(F_FECHA_ULTIMA_REVISION,'"', ''),
    F_FECHA_PROXIMA_REVISION       = replace(F_FECHA_PROXIMA_REVISION,'"', ''),
    I_BOTON_HABILITADO             = replace(I_BOTON_HABILITADO,'"', ''),
    R_CIUDAD                       = replace(R_CIUDAD,'"', ''),
    D_USUARIO_INGRESA_DATOS   = replace(D_USUARIO_INGRESA_DATOS,'"', '')


    -- Se realiza el cargue de la data a la tabla
    INSERT INTO TBL_CERTI_GNV(PLACA, ID_ROM, NIT_DISTRIBUIDOR, NIT_TALLER_CONV,                         
      NIT_CERTIFICADOR, FECHA_CERTIFICACION_INICIAL,
      FECHA_ULTIMA_REVISION, FECHA_PROXIMA_REVISION,
      BOTON_HABILITADO, CIUDAD, USUARIO_INGRESA_DATOS,FECHA_PROCESAMIENTO, INFORMACION_REGISTRO) 
           SELECT R_PLACA, R_ID_ROM,D_NIT_DISTRIBUIDOR,                                 
      D_NIT_TALLER_CONV,D_NIT_CERTIFICADOR,F_FECHA_CERTIFICACION_INICIAL,
    F_FECHA_ULTIMA_REVISION,F_FECHA_PROXIMA_REVISION,R_CIUDAD,
    I_BOTON_HABILITADO,D_USUARIO_INGRESA_DATOS,GETDATE(), 'I'
           FROM #ImportSUIC  

    SELECT * FROM #ImportSUIC 

    Tambien les comparto uno de los registros que vienen informados en el archivo csv

    "1","WMK287","AE00000071377D06","0","9000853580","8600123361","28/03/2016","28/03/2017","11001","CT_AMARULANDA","04/04/2016 08:57:46 a.m.","N","200910","/data1/aplicaciones/publico/gnv/import/datos25032015.txt","N","541","25/03/2015","S","1018436894"

    Muchas gracias.


    Yamid Pertuz

    miércoles, 14 de diciembre de 2016 16:48

Respuestas

  • Yamid88,

    ¿Cómo obtienes el valor de la longitud de cada columna? El mensaje de error menciona que el valor a insertar tiene una longitud mayor a la definición de la columna destino, por tanto informa que los datos podrían ser truncados. 

    Puedes intentar cambiar la longitud de las columnas (de la tabla temporal) a una longitud prudente y luego evaluar la longitud de los datos insertados, sobre eso podrías conocer que columna es la que tenía menor longitud respecto al valor que se intenta insertar:

    ALTER PROCEDURE dbo.SUIC_Migracion
    AS
    BEGIN
        SET NOCOUNT ON;    
    
        CREATE TABLE #ImportSUIC 
        ( 
    	   D_CODIGO VARCHAR(2000),
    	   R_PLACA VARCHAR(2000),                
    	   R_ID_ROM VARCHAR(2000),            
    	   D_NIT_DISTRIBUIDOR VARCHAR(2000),      
    	   D_NIT_TALLER_CONV VARCHAR(2000),        
    	   D_NIT_CERTIFICADOR VARCHAR(2000),      
    	   F_FECHA_ULTIMA_REVISION VARCHAR(2000),        
    	   F_FECHA_PROXIMA_REVISION VARCHAR(2000),      
    	   R_CIUDAD VARCHAR(2000), 
    	   D_NOMBRE_ORACLE_USER VARCHAR(2000),  
    	   F_FECHA_INGRESA_ORACLE VARCHAR(2000),        
    	   I_RECERTIFICACION VARCHAR(2000),       
    	   N_MES_REPORTE VARCHAR(2000),             
    	   D_NOMBRE_ARCHIVO VARCHAR(2000),     
    	   I_ACTUALIZO_VEHICULO VARCHAR(2000),   
    	   N_NUMERO_LINEA VARCHAR(2000),          
    	   F_FECHA_CERTIFICACION_INICIAL VARCHAR(2000),  
    	   I_BOTON_HABILITADO VARCHAR(2000),    
    	   D_USUARIO_INGRESA_DATOS VARCHAR(2000)
        ); 
    
        BULK INSERT dbo.#ImportSUIC 
        FROM 'C:\Users\opertuzo\Documents\Proyectos\everilion GNF\ARC/cargueSUIC1.csv'
        WITH 
        ( 
    	   FIRSTROW = 2,
    	   FIELDTERMINATOR = ',',
    	   ROWTERMINATOR ='\n'
        )  
    
        UPDATE #ImportSUIC
        SET 
    	   R_PLACA                        = REPLACE(R_PLACA,'"', ''),
    	   R_ID_ROM                       = REPLACE(R_ID_ROM,'"', ''),
    	   D_NIT_DISTRIBUIDOR             = REPLACE(D_NIT_DISTRIBUIDOR,'"', ''),
    	   D_NIT_TALLER_CONV              = REPLACE(D_NIT_TALLER_CONV,'"', ''),
    	   D_NIT_CERTIFICADOR             = REPLACE(D_NIT_CERTIFICADOR,'"', ''),
    	   F_FECHA_CERTIFICACION_INICIAL  = REPLACE(F_FECHA_CERTIFICACION_INICIAL,'"', ''),
    	   F_FECHA_ULTIMA_REVISION        = REPLACE(F_FECHA_ULTIMA_REVISION,'"', ''),
    	   F_FECHA_PROXIMA_REVISION       = REPLACE(F_FECHA_PROXIMA_REVISION,'"', ''),
    	   I_BOTON_HABILITADO             = REPLACE(I_BOTON_HABILITADO,'"', ''),
    	   R_CIUDAD                       = REPLACE(R_CIUDAD,'"', ''),
    	   D_USUARIO_INGRESA_DATOS        = REPLACE(D_USUARIO_INGRESA_DATOS,'"', '');
        END
    GO

    Analiza la máxima longitud insertada en cada columna y sobre eso modifica la definición de las columnas:

    SELECT
        MAX(DATALENGTH(R_PLACA)),
        MAX(DATALENGTH(R_ID_ROM)),
        /*Columnas siguientes*/
    FROM	  
        #ImportSUIC;


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 14 de diciembre de 2016 17:37