2016-12-13 71 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(); 
相關問題