SQL Server Upsert

SQL Server Upsert

En SQL Server, una operación "Upsert" combina las acciones de un inserto y una declaración de actualización en una sola declaración. Esta operación inserta una nueva fila en una tabla si esa fila no está presente. De lo contrario, actualiza una fila ya presente. El beneficio de realizar una operación Upsert es que elimina la necesidad de declaraciones de inserción y actualización separadas, simplificando su código SQL y reduciendo la probabilidad de errores.

Creando una mesa

Creemos una tabla en el servidor SQL que podemos usar para realizar las operaciones UPSERT en.

Crear tabla [DBO].[Empleado](
[Empid] [Smallint] No Null,
[Nombre] [nvarchar] (50) No nulo,
[Depid] [Smallint] Null,
[Sal] [int] nulo
)
Insertar en [DBO].[Empleado] ([Empid], [Nombre], [Depid], [Sal])
VALORES
(1, 'Moumita', 5, 50000),
(2, 'Orijit', 2, 30000),
(3, 'somdeb', 5, 60000),
(4, 'Rocky', 2, 50000),
Seleccione * de [DBO].[Empleado];

Producción:

Nombre empidado depid sal
1 Moumita 5 50000
2 Orijit 2 30000
3 Somdeb 5 60000
4 Rocky 2 50000

Formas de realizar la operación Upsert

Hay varias formas de realizar una operación Upsert en el servidor SQL. En este artículo, discutiremos los tres métodos comunes para realizar una operación UPSERT: utilizando la cláusula EXISTS, la función RowCount y la declaración de fusión.

1. Usando la cláusula EXISTS

Este método implica usar una subconsulta para verificar si la fila ya existe en la tabla antes de realizar una instrucción de inserción o actualización. La cláusula EXISTS devuelve verdadero si la subconsulta devuelve alguna fila.

Comenzar la transacción
declarar @EmployeeId int = 17;
declarar @name varchar (max) = 'bidisha';
Si existe (seleccione * de DBO.Empleado con (Updlock, Serializable)
donde empid = @EmployeeId)
Actualizar DBO.Empleado
Establecer nombre = @name
Donde empid = @EmployeeId
DEMÁS
Insertar en DBO.Empleado (Empid, nombre)
VALORES
(@EmployeeId, @name)
Transacción de cometer;

Producción:

Nombre empidado depid sal
17 Bidisha Null Null

Aquí, el código SQL utiliza el método Exists para realizar una operación UPSERT en el servidor SQL. Inicia una transacción y declara las variables para mantener los valores de identificación y nombre del empleado. El código verifica si existe un registro con la identificación de empleado dada en la tabla utilizando la cláusula EXISTS. Si existe, actualiza el nombre del empleado a un nuevo valor. De lo contrario, inserta una nueva fila con la identificación y el nombre del empleado dado.

2. Usando la función RowCount

Este método implica ejecutar una instrucción de actualización primero, seguido de una declaración de inserción si la declaración de actualización no actualizó ninguna fila.

Comenzar la transacción
declarar @EmployeeId int = 18;
declarar @name varchar (max) = 'sonalika';
Actualizar DBO.Empleado con (Updlock, Serializable)
Establecer nombre = @name
Donde empid = @EmployeeId
Si @@ RowCount = 0
Insertar en DBO.Empleado (Empid, nombre)
VALORES
(@EmployeeId, @name)
Transacción de cometer;

Producción:

Nombre empidado depid sal
18 Sonalika nulo nulo

Aquí, el código SQL intenta actualizar el nombre del empleado con la ID dada en la tabla utilizando el UpdLock y las sugerencias serializables que adquieren un bloqueo exclusivo en la fila seleccionada. Si la actualización no afecta a las filas, el código realiza una instrucción de inserción para insertar una nueva fila con la identificación del empleado y los valores de los nombres.

3. Usando la declaración de fusión

Una tercera forma de realizar una operación UPSERT en el servidor SQL es aplicar la declaración de fusión. Este método combina las acciones de las declaraciones de inserción y actualización en una sola instrucción, similar a la cláusula existe pero con características más avanzadas.

declarar @EmployeeId int = 18;
declarar @name varchar (max) = 'arnab';
Fusionar DBO.Empleado con (holdlock) como objetivo
Usando (valores (@EmployeeID, @name)) como fuente (Empleado, nombre)
En el blanco.Empid = fuente.ID de empleado
Cuando se combina, actualice el objetivo establecer.Nombre = fuente.Nombre
Cuando no se coincide, luego inserte (Empid, Nombre) valores (fuente.Empleado, fuente.Nombre);

Producción:

Nombre empidado depid sal
18 Arnab Null Null

Esta consulta SQL utiliza la declaración de fusión para fusionar los datos de una tabla de origen en una tabla de destino. Coincide con las filas entre las dos tablas usando la "columna Empid", y actualiza la "columna de nombre" en la tabla de destino si se encuentra una coincidencia. Si no hay coincidencia, inserta una nueva fila.

Conclusión

Las operaciones de Upsert son un requisito común en el servidor SQL. Hay múltiples formas de lograrlos, incluido el uso del método Exists, la función RowCount y la declaración de fusión. Podemos elegir el mejor enfoque basado en nuestro requisito.