SQL Server UpSert

SQL Server UpSert

In SQL Server, un'operazione "UPSERT" combina le azioni sia di un inserto che di un'istruzione di aggiornamento in una singola istruzione. Questa operazione inserisce una nuova riga in una tabella se quella riga non è presente. Altrimenti, aggiorna una riga già presente. Il vantaggio di eseguire un'operazione UPSert è che elimina la necessità di dichiarazioni di insert e aggiornamenti separati, semplificando il codice SQL e riducendo la probabilità di errori.

Creazione di una tabella

Creiamo una tabella nel server SQL su cui possiamo utilizzare per eseguire le operazioni UPSert.

Crea tabella [DBO].[Dipendente](
[Empid] [Smallint] non null,
[Nome] [nvarchar] (50) non null,
[Depid] [Smallint] Null,
[Sal] [int] null
)
Inserire in [DBO].[Employee] ([Empid], [Name], [Depid], [Sal])
VALORI
(1, 'Moumita', 5, 50000),
(2, "Orijit", 2, 30000),
(3, 'Somdeb', 5, 60000),
(4, 'Rocky', 2, 50000),
Seleziona * da [DBO].[Dipendente];

Produzione:

Empid Nome Depid Sal
1 Moumita 5 50000
2 Orijit 2 30000
3 Somdeb 5 60000
4 Rocky 2 50000

Modi per eseguire l'operazione UpSert

Esistono diversi modi per eseguire un'operazione UPSert nel server SQL. In questo articolo, discuteremo i tre metodi comuni per eseguire un'operazione UPSert: l'uso della clausola esista, la funzione Rowcount e la dichiarazione di unione.

1. Usando la clausola esiste

Questo metodo prevede l'utilizzo di una sottoquery per verificare se la riga esiste già nella tabella prima di eseguire un'istruzione insert o aggiornamento. La clausola esista restituisce true se la sottocquery restituisce delle righe.

Inizia la transazione
dichiarare @employeeid int = 17;
dichiarare @name varchar (max) = 'bidisha';
Se esiste (seleziona * da DBO.Dipendente con (updatk, serializzabile)
dove empid = @employeeid)
Aggiorna DBO.Dipendente
Set name = @Name
Dove empid = @employeeid
ALTRO
Inserire in DBO.Dipendente (empid, nome)
VALORI
(@Employeeid, @name)
Commettere transazione;

Produzione:

Empid Nome Depid Sal
17 Bidisha null null

Qui, il codice SQL utilizza il metodo esiste per eseguire un'operazione UPSert nel server SQL. Avvia una transazione e dichiara le variabili per contenere l'ID dipendente e i valori dei nomi. Il codice controlla se nella tabella esiste un record con l'ID dipendente fornito utilizzando la clausola esiste. Se esiste, aggiorna il nome del dipendente a un nuovo valore. Altrimenti, inserisce una nuova riga con l'ID e il nome del dipendente dato.

2. Utilizzando la funzione Rowcount

Questo metodo prevede prima l'esecuzione di un'istruzione di aggiornamento, seguita da un'istruzione Insert se l'istruzione di aggiornamento non ha aggiornato le righe.

Inizia la transazione
dichiarare @employeeid int = 18;
dichiarare @name varchar (max) = 'sonalika';
Aggiorna DBO.Dipendente con (updatk, serializzabile)
Set name = @Name
Dove empid = @employeeid
If @@ rowcount = 0
Inserire in DBO.Dipendente (empid, nome)
VALORI
(@Employeeid, @name)
Commettere transazione;

Produzione:

Empid Nome Depid Sal
18 Sonalika null null

Qui, il codice SQL tenta di aggiornare il nome del dipendente con l'ID indicato nella tabella utilizzando i suggerimenti di aggiornamento e serializzabile che acquisiscono un blocco esclusivo sulla riga selezionata. Se l'aggiornamento non influisce sulle righe, il codice esegue un'istruzione Insert per inserire una nuova riga con l'ID dipendente e i valori dei nomi dei dipendenti indicati.

3. Utilizzando l'istruzione Merge

Un terzo modo per eseguire un'operazione UPSert nel server SQL è applicare l'istruzione unione. Questo metodo combina le azioni delle dichiarazioni di inserto e aggiornamento in un'unica istruzione, simile alla clausola esiste ma con caratteristiche più avanzate.

dichiarare @employeeid int = 18;
dichiarare @name varchar (max) = 'arnab';
Unisci DBO.Dipendente con (holdlock) come target
Utilizzo (valori (@mployeeid, @name)) come sorgente (dipendente, nome)
Sull'obiettivo.Empid = fonte.ID Dipendente
Se abbinato, aggiorna imposta Target.Name = fonte.Nome
Se non abbinato, inserisci (empid, nome) valori (sorgente.Employeeid, fonte.Nome);

Produzione:

Empid Nome Depid Sal
18 arnab null null

Questa query SQL utilizza l'istruzione unione per unire i dati da una tabella di origine in una tabella di destinazione. Corrisponde alle righe tra le due tabelle usando la "colonna EMPID" e aggiorna la "colonna Nome" nella tabella di destinazione se si trova una corrispondenza. Se non c'è corrispondenza, inserisce una nuova riga.

Conclusione

Le operazioni UPSert sono un requisito comune nel server SQL. Esistono diversi modi per raggiungerli, incluso l'utilizzo del metodo esista, la funzione RowCount e l'istruzione unione. Possiamo scegliere l'approccio migliore in base al nostro requisito.