none
Llamar procedimiento almacenado, dentro de sentencia MERGE RRS feed

  • Pregunta

  • Buen dia a todos, espero me puedan ayudar, tengo un procedimiento sql, en el cual valido primero si existe informacion en cierta tabla, en caso de que si tenga informacion, uso la sentencia merge, lo que deseo, es que despues de que se inserte o actualize dentro de la sentencia merge, es llamar otro procedimiento almacenado, es posible realizar eso?

    Este es un ejemplo sencillo que tengo:

    MERGE Usuarios AS TARGET
    USING UsuariosActual AS SOURCE 
       ON (TARGET.Codigo = SOURCE.Codigo) 
    --Realizo mi actualizacon de datos
    --Aqui es donde deseo llamar el procedimiento almacenado
     WHEN MATCHED AND TARGET.Nombre <> SOURCE.Nombre 
       OR TARGET.Puntos <> SOURCE.Puntos THEN 
       UPDATE SET TARGET.Nombre = SOURCE.Nombre, 
                  TARGET.Puntos = SOURCE.Puntos 
    --Realizo mi insercion de datos
     WHEN NOT MATCHED BY TARGET THEN 
       INSERT (Codigo, Nombre, Puntos) 
       VALUES (SOURCE.Codigo, SOURCE.Nombre, SOURCE.Puntos)
    --se borra el registro
     WHEN NOT MATCHED BY SOURCE THEN 
       DELETE
    

    Espero me puedan ayudar, muchas gracias.

    sábado, 18 de mayo de 2019 14:52

Respuestas

  • No, la sentencia Merge no te permite esa combinación. Lo que podrías hacer es poner un trigger de tipo "after insert" sobre la tabla Usuarios que haga esa actualización al recibir un Insert.

    O bien otra cosa que podrías hacer es en el "using" del principio de la merge meter el "join" con login de forma que el SOURCE tenga los datos de las dos tablas. Eso te permitiría que el Insert asigne directamente la clave sin necesitar una segunda operación de actualización sobre la tabla.

    sábado, 18 de mayo de 2019 18:35

Todas las respuestas

  • El procedimiento lo puedes llamar antes o después, pero no dentro de la sentencia MERGE.

    Si lo que quieres es que se ejecute algo de código cada vez que la MERGE inserta, actualiza o borra un registro en el Target, lo que puedes hacer es conectar uno o varios triggers sobre dicha tabla. Los triggers pueden llamar al procedimiento almacenado, o bien pueden ejecutar directamente las mismas operaciones que planeabas ejecutar desde el procedimiento almacenado. Ojo, esto hará disminuir significativamente el rendimiento del MERGE.

    sábado, 18 de mayo de 2019 15:47
  • Entiendo, muchas gracias.
    sábado, 18 de mayo de 2019 15:53
  • El procedimiento lo puedes llamar antes o después, pero no dentro de la sentencia MERGE.

    Si lo que quieres es que se ejecute algo de código cada vez que la MERGE inserta, actualiza o borra un registro en el Target, lo que puedes hacer es conectar uno o varios triggers sobre dicha tabla. Los triggers pueden llamar al procedimiento almacenado, o bien pueden ejecutar directamente las mismas operaciones que planeabas ejecutar desde el procedimiento almacenado. Ojo, esto hará disminuir significativamente el rendimiento del MERGE.

    Se puede realizar una actualizacion, despues de un insert?, de la siguiente manera, ya que lo estoy intentando, pero no me permite realizar, o que me puede recomendar:

    MERGE Usuarios AS TARGET
    USING UsuariosActual AS SOURCE 
       ON (TARGET.Codigo = SOURCE.Codigo) 
    --Realizo mi actualizacon de datos
    WHEN MATCHED AND TARGET.Nombre <> SOURCE.Nombre 
       OR TARGET.Puntos <> SOURCE.Puntos THEN 
       UPDATE SET TARGET.Nombre = SOURCE.Nombre, 
                  TARGET.Puntos = SOURCE.Puntos 
    --Realizo mi insercion de datos
     WHEN NOT MATCHED BY TARGET THEN 
       INSERT (Codigo, Nombre, Puntos) 
       VALUES (SOURCE.Codigo, SOURCE.Nombre, SOURCE.Puntos)
    --Aqui es donde deseo actualizar una columna de la tabla usuarios despues de insertar,  algo asi:
    --UPDATE
    	--User
    	--SET
    	-- User.Clave = log.Clave
    	--FROM
    	--Usuarios AS User
    	--LEFT JOIN login AS log ON log.Nombre = User.Nombre
    WHEN NOT MATCHED BY SOURCE THEN 
       DELETE
    

    sábado, 18 de mayo de 2019 16:37
  • No, la sentencia Merge no te permite esa combinación. Lo que podrías hacer es poner un trigger de tipo "after insert" sobre la tabla Usuarios que haga esa actualización al recibir un Insert.

    O bien otra cosa que podrías hacer es en el "using" del principio de la merge meter el "join" con login de forma que el SOURCE tenga los datos de las dos tablas. Eso te permitiría que el Insert asigne directamente la clave sin necesitar una segunda operación de actualización sobre la tabla.

    sábado, 18 de mayo de 2019 18:35