none
Actualizar Un Registro Si Existe, Sino Insertar En SQL Server RRS feed

  • Pregunta

  • Buen dia,

    tengo dos tablas exactamente iguales, A y B , la tabla A contiene registros de usuarios existentes y B contiene registros de nuevos usuarios, necesito poder comparar ambas tablas y que en el caso en que los registros de B existan en A actualice la información y en el caso en el que no existan los inserte.

    Tabla A              TablaB

    usu_codigo        usu_codigo   
    usu_nombre      usu_nombre
    cargo_cod          cargo_cod

    esto sin utilizar "MERGE" ya que la base de datos esta en SQL2005 y no se pudo cambiar el nivel de compatibilidad.

    Gracias.


    miércoles, 10 de febrero de 2016 14:43

Respuestas

  • Hola Jeff M Quintero,

    Vas a tener que hacer dos operaciones: inserción y actualización, tal cual lo haría Merge:

    BEGIN TRANSACTION
    
    BEGIN TRY
    INSERT INTO TablaB
            (usu_codigo, usu_nombre, cargo_cod)
    SELECT
            t1.usu_codigo, t1.usu_nombre, t1.cargo_cod
    FROM
            TablaA t1
    WHERE
            NOT EXISTS (SELECT 1 FROM TablaB WHERE (usu_codigo = t1.usu_codigo));
    
    UPDATE  t2
    SET
            t2.usu_nombre = t1.usu_nombre, t2.cargo_cod = t1cargo_cod
    FROM
            TablaB t2
            INNER JOIN TablaA t1 ON (t1.usu_codigo = t2.usu_codigo)
    WHERE
           (t2.usu_nombre <> t1.usu_nombre OR t2.cargo_cod <> t1cargo_cod)
           COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH
           ROLLBACK TRANSACTION;
    END CATCH


    miércoles, 10 de febrero de 2016 14:51

Todas las respuestas

  • Hola Jeff M Quintero,

    Vas a tener que hacer dos operaciones: inserción y actualización, tal cual lo haría Merge:

    BEGIN TRANSACTION
    
    BEGIN TRY
    INSERT INTO TablaB
            (usu_codigo, usu_nombre, cargo_cod)
    SELECT
            t1.usu_codigo, t1.usu_nombre, t1.cargo_cod
    FROM
            TablaA t1
    WHERE
            NOT EXISTS (SELECT 1 FROM TablaB WHERE (usu_codigo = t1.usu_codigo));
    
    UPDATE  t2
    SET
            t2.usu_nombre = t1.usu_nombre, t2.cargo_cod = t1cargo_cod
    FROM
            TablaB t2
            INNER JOIN TablaA t1 ON (t1.usu_codigo = t2.usu_codigo)
    WHERE
           (t2.usu_nombre <> t1.usu_nombre OR t2.cargo_cod <> t1cargo_cod)
           COMMIT TRANSACTION;
    END TRY
    BEGIN CATCH
           ROLLBACK TRANSACTION;
    END CATCH


    miércoles, 10 de febrero de 2016 14:51
  • insert into tablaA select a.usu_codigo, a.usu_nombre, a.cargo_cod from [tablaB] a left join [tablaA] b on a.usu_codigo= b.usu_codigo where b.id is null

    espero sea de tu utilidad


    Att. Franklin Andino



    miércoles, 10 de febrero de 2016 15:03
  • Jeff

    Tengo la impresion de que este es un hilo que da continuidad a la pregunta anterior que hicistes sobre MERGE

    https://social.msdn.microsoft.com/Forums/es-ES/eb9aa818-010b-45bd-9245-153c884b3e66/no-funciona-instruccion-merge?forum=sqlserveres

    Si este es el caso, por favor cierra el hilo anterior y explica que efectivamente el MERGE estaba bien y era un problema de compatibilidad de tu versión de SQL Server para que sirva de apoyo a futuros usuarios con la misma problematica.

    Saludos.


    "Oh, the wind, the wind is blowing,through the graves the wind is blowing,Freedom soon will come; then well come from the shadows".The Partisan(Leonard Cohen) Email: me[at]geohernandez.net Blog:www.geohernandez.net

    miércoles, 10 de febrero de 2016 15:08
  • Hola ,

    si me funciono perfectamente ! te lo agradezco mucho.

    sin embargo al aplicarlo a otro ejemplo no me funciono tal vez me puedas colaborar tambien

    https://social.msdn.microsoft.com/Forums/es-ES/70fbc4dd-74f0-4edf-9aad-dd9bf0c521b2/the-multipart-identifier-t1prfil-could-not-be-bound?forum=sqlserveres

    Gracias :D

    miércoles, 10 de febrero de 2016 16:43