Archivos de Categoría: Base de datos - Paginas 7

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);

Clonar tablas en SQL Server y MySQL

Es habitual que cuando vamos a hacer algún proceso un poco peliagudo sobre una tabla, nos hagamos una copia de seguridad por lo que pueda pasar. Por suerte hay formas bastantes sencillas de hacerlo.

En SQL Server sería así:


select * into tabla_clonada from tabla_origen

y en MySQL asi:


create table tabla_clonada select * from tabla_origen

logicamente si ponemos en vez del asterisco los campos que queremos, nos los crea con esos campos

Variable tipo table en un procedimiento llamado desde PHP

En el proyecto que estoy montando actualmente, por requisitos del cliente, estamos usando PHP contra SQL server. La historia es que lleva algún procedimiento medio enrevesado y uno de ellos devuelve el recorset de una variable tipo tabla.

Hasta ahora, al llamar procedimientos que devuelven resultados de tablas sí que devolvían registros pero al intentarlo de una variable tipo tabla, no devolvía nada mientras que ejecutándolo desde el cliente de SQL sí que lo hacía.

Después de un rato googleando, resulta que la solución es bastante sencilla, basta con poner un SET NOCOUNT ON al principio del procedimiento. Es una chorrada pero hace perder un rato precioso hasta que te das cuenta.