使用csv文件在表中插入和更新记录

时间:2016-12-13 21:25:45

标签: mysql sql-server csv

我发现自己正在执行一个SP,它接受一个csv文件来加载一个TMP表,并根据文件中报告的记录,在最终表中执行记录的插入或更新,以下内容发生在我身上:

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

然后我分享我正在做的事情,以便他们通过表明我做错了来帮助我。

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  

2 个答案:

答案 0 :(得分:0)

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

.controller('SomeName', ['someData', function(someData) {
(...)
// works fine

然后插入缺少的行:

  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

答案 1 :(得分: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();