SQL Server Upsert

SQL Server Upsert

I SQL Server kombinerer en "Upsert" -operasjon handlingene til både et innlegg og en oppdateringsuttalelse i en enkelt uttalelse. Denne operasjonen setter inn en ny rad i en tabell hvis den raden ikke er til stede. Ellers oppdaterer den en allerede nåværende rad. Fordelen med.

Opprette et bord

La oss opprette en tabell i SQL -serveren som vi kan bruke til å utføre Upsert -operasjonene på.

Lag tabell [dbo].[Ansatt](
[Empid] [Smallint] Ikke null,
[Navn] [nvarchar] (50) Ikke null,
[Depid] [Smallint] NULL,
[Sal] [int] null
)
Sett inn [dbo].[Ansatt] ([Empid], [navn], [depid], [sal])
Verdier
(1, 'Moumita', 5, 50000),
(2, 'Orijit', 2, 30000),
(3, 'Somdeb', 5, 60000),
(4, 'Rocky', 2, 50000),
Velg * fra [DBO].[Ansatt];

Produksjon:

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

Måter å utføre oppføringsoperasjonen

Det er flere måter å utføre en oppgangsoperasjon i SQL -serveren. I denne artikkelen vil vi diskutere de tre vanlige metodene for å utføre en oppgangsoperasjon: ved å bruke Exists -leddet, RowCount -funksjonen og Merge -setningen.

1. Bruke eksistens leddet

Denne metoden innebærer bruk. Eksister -leddet returnerer sant hvis undervisningen returnerer noen rader.

Begynn transaksjon
erklære @Employeeid int = 17;
erklære @Name varchar (maks) = 'Bidisha';
Hvis eksisterer (velg * fra DBO.Ansatt med (updlock, serialiserbar)
Hvor empid = @Employeeeid)
Oppdater dbo.Ansatt
Sett navn = @Name
Hvor empid = @Employeeeid
ELLERS
Sett inn DBO.Ansatt (Empid, navn)
Verdier
(@Employeeid, @Name)
Forplikte transaksjon;

Produksjon:

Empid navn Depid Sal
17 Bidisha null null

Her bruker SQL -koden Exists -metoden for å utføre en oppgangsoperasjon i SQL -serveren. Den setter i gang en transaksjon og erklærer variablene for å holde ansattes ID og navneverdier. Koden sjekker om en post med den gitte ansattes ID eksisterer i tabellen ved å bruke den eksisterende leddet. Hvis det eksisterer, oppdaterer den ansattes navn til en ny verdi. Ellers setter den inn en ny rad med den gitte ansattes ID og navn.

2. Bruke RowCount -funksjonen

Denne metoden innebærer å kjøre en oppdateringsuttalelse først, etterfulgt av en innsatsuttalelse hvis oppdateringsuttalelsen ikke oppdaterte noen rader.

Begynn transaksjon
erklære @Employeeid int = 18;
erklære @name varchar (maks) = 'sonalika';
Oppdater dbo.Ansatt med (updlock, serialiserbar)
Sett navn = @Name
Hvor empid = @Employeeeid
Hvis @@ rowcount = 0
Sett inn DBO.Ansatt (Empid, navn)
Verdier
(@Employeeid, @Name)
Forplikte transaksjon;

Produksjon:

Empid navn Depid Sal
18 sonalika null null

Her prøver SQL -koden å oppdatere navnet på den ansatte med den gitte IDen i tabellen ved hjelp av oppdateringen og serialiserbare hint som skaffer seg en eksklusiv lås på den valgte raden. Hvis oppdateringen ikke påvirker noen rader, utfører koden en innsatserklæring for å sette inn en ny rad med den gitte ansattes ID og navneverdier.

3. Bruke Merge -uttalelsen

En tredje måte å utføre en oppgangsoperasjon i SQL -serveren er å bruke Merge -setningen. Denne metoden kombinerer handlingene til innsats- og oppdateringsuttalelsene til en enkelt uttalelse, ligner på eksisterende leddet, men med mer avanserte funksjoner.

erklære @Employeeid int = 18;
erklære @name varchar (maks) = 'arnab';
Slå sammen dbo.Ansatt med (holdlock) som mål
Bruker (verdier (@EmployeeId, @Name)) som kilde (ansatt, navn)
På målet.Empid = kilde.Ansatt ID
Når du matchet, oppdaterer du Set Target.Navn = kilde.Navn
Når du ikke er matchet, sett inn (empid, navn) verdier (kilde.EmployeeId, kilde.Navn);

Produksjon:

Empid navn Depid Sal
18 Arnab null null

Denne SQL -spørringen bruker Merge -setningen for å slå sammen dataene fra en kildetabell til en måltabell. Det samsvarer med radene mellom de to tabellene ved å bruke "Empid -kolonnen", og oppdaterer "Navnkolonnen" i måltabellen hvis en kamp er funnet. Hvis det ikke er noen kamp, ​​setter den inn en ny rad.

Konklusjon

Upsert -operasjonene er et vanlig krav i SQL -serveren. Det er flere måter å oppnå dem på, inkludert bruk. Vi kan velge den beste tilnærmingen basert på kravet vårt.