2016-12-13 72 views
0

我发现自己执行一个SP,它使用csv文件加载TMP表,并根据文件中报告的记录执行插入或更新最终表中的记录并且下面发生在我身上:使用csv文件插入和更新表中的记录

当表格完全为空时,我插入记录,这是正确的,但是当加载的文件有一些记录和插入以及未插入新记录时,I我只更新已经插入的记录并且我不插入新记录。

然后,我分享我在做什么,以便他们帮助我,指出我做错了。

IF NOT EXISTS (SELECT A.placa, 
         A.id_rom 
       FROM tbl_certi_gnv AS A, 
         #importsuic AS B 
       WHERE A.placa = B.r_placa 
         AND A.id_rom = B.r_id_rom) 
    BEGIN 
     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) 
     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, 
      d_boton_habilitado, 
      r_ciudad, 
      d_usuario_ingresa_datos, 
      Getdate() 
     FROM #importsuic 
    END 
ELSE 
    BEGIN 
     UPDATE tbl_certi_gnv 
     SET fecha_proxima_revision = B.f_fecha_proxima_revision, 
      fecha_procesamiento = Getdate() 
     FROM tbl_certi_gnv AS A, 
      #importsuic AS B 
     WHERE A.placa = B.r_placa 
      AND A.id_rom = B.r_id_rom 

     PRINT 'ENTRA A ACTUALIZAR' 
    END 
+0

这是MySQL或SQL服务器? – SqlZim

+0

你只会更新的原因是因为exists子句是错误的(记录确实存在)。我的猜测是你想要插入。在SQL Server中,你可以使用['MERGE'](https://msdn.microsoft.com/en-us/library/bb510625.aspx)。 – ZLK

回答

0

问题是,您的逻辑检查是否存在任何行,如果存在,它会转到更新部分。你需要做这样的事情:

UPDATE tbl_certi_gnv 
    SET fecha_proxima_revision = B.f_fecha_proxima_revision, 
     fecha_procesamiento = Getdate() 
    FROM tbl_certi_gnv AS A, 
     #importsuic AS B 
    WHERE A.placa = B.r_placa 
     AND A.id_rom = B.r_id_rom 

然后插入缺少行:

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) 
    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, 
     d_boton_habilitado, 
     r_ciudad, 
     d_usuario_ingresa_datos, 
     Getdate() 
    FROM #importsuic B 
    WHERE not exists (
      select 1 
      FROM tbl_certi_gnv AS A 
      WHERE A.placa = B.r_placa 
        AND A.id_rom = B.r_id_rom) 
0

我只是用merge这一点。

像这样:

merge tbl_certi_gnv  as target 
    using #importsuic as source 
    on target.placa = source.placa 
     and target.id_rom = source.id_rom 
     when not matched by target 
     then insert (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) 
     values (source.r_placa, source.r_id_rom, source.d_nit_distribuidor, source.d_nit_taller_conv, source.d_nit_certificador 
       , source.f_fecha_certificacion_inicial, source.f_fecha_ultima_revision, source.f_fecha_proxima_revision 
       , source.d_boton_habilitado, source.r_ciudad, source.d_usuario_ingresa_datos, Getdate()) 
     when matched by target 
     then update 
      set target.fecha_proxima_revision = source.f_fecha_proxima_revision 
       ,target.fecha_procesamiento = Getdate(); 
相关问题