Insertar o actualizar registro dependiendo de si existe o no

Uno operación típica dentro de un procedimiento es comprobar si existe un registro para actualizarlo y en caso contrario insertarlo. Esto al principio lo hacía de la siguiente forma:

IF EXISTS ( SELECT campo FROM tabla WHERE id = @id ) 
	UPDATE  tabla	SET     campo = @campo WHERE   id = @id
ELSE 
	INSERT  INTO tabla ( id, campo ) VALUES  ( @id, @campo )

Pero había que estar metiendo transacciones así que empecé a usar la opción de hacer la actualización directamente y comprobar las columnas afectadas, en el caso no haberlas, hacia la inserción.

UPDATE tabla SET campo = @campo WHERE id = @id
IF @@ROWCOUNT = 0
	INSERT  INTO tabla ( id, campo ) VALUES  ( @id, @campo )

Con esto seguimos teniendo que meter transacciones pero es más eficiente.

Pero desde la versión 2008 de SQL Server, podemos usar el merge que no se si será más efectivo de cara a rendimiento pero sí que quedaremos más “pofesionales”.

MERGE INTO tabla 
USING (VALUES (@id, @campo)) AS tmp (id, campo) ON campo.id = tmp.id
WHEN MATCHED THEN
   UPDATE SET campo = tmp.campo
WHEN NOT MATCHED THEN   
   INSERT (id, campo) VALUES (tmp.id, tmp.campo);
Dejar un comentario?

2 Comentarios.

  1. hola, yo tengo un inconveniente, yo tengo una base de datos que están trabajando en dos servidores diferentes, ahora yo deseo insertar los valores no existentes de una de las tablas hacia la otra, esto me podría ayudar?

    • En un principio debería funcionar pero habría que ver como esta configurado el balanceador de carga que usas para la base de datos.

Deje un comentario


NOTA - Puede usar estosHTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.