SQL Server Upsert

SQL Server Upsert

In SQL Server kombiniert eine "Upsert" -Operation die Aktionen sowohl eines Inserts als auch einer Update -Anweisung in eine einzelne Anweisung. Diese Operation fügt eine neue Zeile in eine Tabelle ein, wenn diese Zeile nicht vorhanden ist. Andernfalls aktualisiert es eine bereits vorhandene Zeile. Der Vorteil der Durchführung eines Upsert -Vorgangs besteht darin, dass die Notwendigkeit separater Einfüge- und Aktualisierungsanweisungen beseitigt, Ihr SQL -Code vereinfacht und die Wahrscheinlichkeit von Fehlern verringert wird.

Erstellen einer Tabelle

Erstellen wir eine Tabelle auf dem SQL -Server, mit dem wir die Upsert -Operationen ausführen können.

Tabelle erstellen [DBO].[Mitarbeiter](
[Empid] [smallint] nicht null,
[Name] [Nvarchar] (50) NICHT NULL,
[Depid] [Smallint] null,
[Sal] [int] null
)
In [DBO] einfügen.[Mitarbeiter] ([Empid], [Name], [Depid], [Sal])
WERTE
(1, 'Moumita', 5, 50000),
(2, 'orijit', 2, 30000),
(3, 'somdeb', 5, 60000),
(4, 'Rocky', 2, 50000),
Wählen Sie * aus [DBO] aus.[Mitarbeiter];

Ausgang:

Empid Name Depid Sal
1 MUUMMITA 5 50000
2 Orijit 2 30000
3 somdeb 5 60000
4 Rocky 2 50000

Möglichkeiten zur Durchführung des Upsert -Betriebs

Auf dem SQL -Server gibt es verschiedene Möglichkeiten, einen Upsert -Vorgang auszuführen. In diesem Artikel werden wir die drei gängigen Methoden zur Durchführung eines Upsert -Vorgangs erörtern: Verwenden der existierenden Klausel, der RowCount -Funktion und der Merge -Anweisung.

1. Verwenden der existierenden Klausel

Diese Methode umfasst die Verwendung einer Unterabfrage, um zu überprüfen, ob die Zeile bereits in der Tabelle vorhanden ist. Die existierende Klausel gibt true zurück, wenn die Unterabfrage Zeilen zurückgibt.

Transaktion beginnen
Declare @EmplodeID int = 17;
Declare @Name varchar (max) = 'bidisha';
Wenn existiert (wählen Sie * aus DBO aus.Mitarbeiter mit (Updlock, serialisierbar)
wo empid = @Emplodeeid)
Aktualisieren Sie DBO.Mitarbeiter
Setzen Sie Name = @Name
Wo empid = @Emplodeid
ANDERS
In DBO einfügen.Mitarbeiter (Empid, Name)
WERTE
(@Employeeid, @Name)
Transaktion begehen;

Ausgang:

Empid Name Depid Sal
17 Bidisha Null Null

Hier verwendet der SQL -Code die existierende Methode, um einen Upsert -Vorgang auf dem SQL -Server durchzuführen. Es initiiert eine Transaktion und deklariert die Variablen, um die Mitarbeiter -ID und Namenswerte zu halten. Der Code prüft, ob ein Datensatz mit der angegebenen Mitarbeiter -ID in der Tabelle mit der existierenden Klausel vorhanden ist. Wenn es existiert, aktualisiert es den Namen des Mitarbeiters auf einen neuen Wert. Andernfalls fügt es eine neue Zeile mit der angegebenen Mitarbeiter -ID und dem Namen ein.

2. Verwenden der RowCount -Funktion

Diese Methode umfasst zuerst das Ausführen einer Update -Anweisung, gefolgt von einer Einfügeanweisung, wenn die Update -Anweisung keine Zeilen aktualisiert hat.

Transaktion beginnen
Declare @EmplodeId int = 18;
Declare @Name varchar (max) = 'Sonalika';
Aktualisieren Sie DBO.Mitarbeiter mit (Updlock, serialisierbar)
Setzen Sie Name = @Name
Wo empid = @Emplodeid
Wenn @@ RowCount = 0
In DBO einfügen.Mitarbeiter (Empid, Name)
WERTE
(@Employeeid, @Name)
Transaktion begehen;

Ausgang:

Empid Name Depid Sal
18 Sonalika Null Null

Hier versucht der SQL -Code, den Namen des Mitarbeiters mit der angegebenen ID in der Tabelle mithilfe der Updlock- und serialisierbaren Hinweise zu aktualisieren, die eine exklusive Sperre in der ausgewählten Zeile erwerben. Wenn das Update keine Zeilen betrifft, führt der Code eine Einfügeanweisung aus, um eine neue Zeile mit der angegebenen Mitarbeiter -ID und den Namenswerten einzufügen.

3. Verwenden der Merge -Anweisung

Eine dritte Möglichkeit, einen Upsert -Betrieb auf dem SQL -Server auszuführen, besteht darin, die Merge -Anweisung anzuwenden. Diese Methode kombiniert die Aktionen der Einfügen- und Aktualisierungsanweisungen in eine einzelne Anweisung, ähnlich der existierenden Klausel, jedoch mit fortgeschritteneren Funktionen.

Declare @EmplodeId int = 18;
Declare @Name varchar (max) = 'arnab';
Fusion DBO.Mitarbeiter mit (Holdlock) als Ziel
Verwenden Sie (Werte (@EmployeEID, @Name)) als Quelle (Mitarbeiterd, Name)
Am Ziel.Empid = Quelle.Angestellten ID
Wenn Sie angepasst werden, dann aktualisieren Sie das Ziel.Name = Quelle.Name
Wenn Sie nicht übereinstimmen, fügen Sie (Empid, Name) Werte (Quelle.Mitarbeiter, Quelle.Name);

Ausgang:

Empid Name Depid Sal
18 Arnab Null Null

Diese SQL -Abfrage verwendet die Merge -Anweisung, um die Daten aus einer Quellentabelle in eine Zieltabelle zusammenzuführen. Es stimmt mit den Zeilen zwischen den beiden Tabellen mit der „Empid -Spalte“ überein und aktualisiert die Spalte „Name Name“ in der Zieltabelle, wenn eine Übereinstimmung gefunden wird. Wenn es keine Übereinstimmung gibt, fügt es eine neue Zeile ein.

Abschluss

Die Upsert -Operationen sind eine häufige Voraussetzung auf dem SQL -Server. Es gibt mehrere Möglichkeiten, sie zu erreichen, einschließlich der Verwendung der existierenden Methode, der RowCount -Funktion und der Merge -Anweisung. Wir können den besten Ansatz basierend auf unseren Anforderungen auswählen.