SQL Server Upsert

SQL Server Upsert

W SQL Server operacja „upsert” łączy działania zarówno wkładki, jak i instrukcji aktualizacji w pojedynczej instrukcji. Ta operacja wprowadza nowy wiersz do tabeli, jeśli ten rząd nie jest obecny. W przeciwnym razie aktualizuje już obecny rząd. Zaletą przeprowadzenia operacji upsert jest to, że eliminuje potrzebę osobnych instrukcji wstawienia i aktualizacji, upraszczając kod SQL i zmniejszając prawdopodobieństwo błędów.

Tworzenie stołu

Utwórzmy tabelę na serwerze SQL, na której możemy użyć do wykonywania operacji upsert.

Utwórz tabelę [DBO].[Pracownik](
[Empid] [Smallint] Not Null,
[Nazwa] [Nvarchar] (50) nie null,
[Depid] [Smallint] null,
[Sal] [int] null
)
Wstaw do [dbo].[Pracownik] ([empid], [nazwa], [Dide], [Sal])
Wartości
(1, „Moumita”, 5, 50000),
(2, „Orijit”, 2, 30000),
(3, „Somdeb”, 5, 60000),
(4, „Rocky”, 2, 50000),
Wybierz * z [dbo].[Pracownik];

Wyjście:

Nazwa empid depid sal
1 Moumita 5 50000
2 Orijit 2 30000
3 Somdeb 5 60000
4 Rocky 2 50000

Sposoby wykonywania operacji upsert

Istnieje kilka sposobów wykonywania operacji upsert na serwerze SQL. W tym artykule omówimy trzy powszechne metody wykonywania operacji upsert: Korzystanie z klauzuli istnieją, funkcja RowCount i instrukcja scalania.

1. Korzystanie z klauzuli istnieje

Ta metoda polega na użyciu podziału do sprawdzenia, czy wiersz już istnieje w tabeli przed wykonaniem instrukcji wstawienia lub aktualizacji. Klauzula istnieje, że zwraca prawdziwie, jeże.

Rozpocznij transakcję
Deklaruj @EmployeEID int = 17;
Declare @Name varchar (max) = „bidisha”;
Jeśli istnieje (wybierz * z DBO.Pracownik z (UpdLock, serializable)
gdzie empid = @EmployeEID)
Zaktualizuj DBO.Pracownik
Ustaw nazwę = @Name
Gdzie empid = @EmployeEID
W PRZECIWNYM RAZIE
Włóż do DBO.Pracownik (empid, nazwa)
Wartości
(@EmployeEID, @Name)
Zatwierdzić transakcję;

Wyjście:

Nazwa empid depid sal
17 BIDISHA NULL NULL

Tutaj kod SQL wykorzystuje metodę ESTIS do wykonania operacji upsert na serwerze SQL. Inicjuje transakcję i deklaruje zmienne do przechowywania identyfikatora pracownika i wartości nazwy. Kod sprawdza, czy rekord z danym identyfikatorem pracownika istnieje w tabeli za pomocą klauzuli istnieje. Jeśli istnieje, aktualizuje nazwę pracownika do nowej wartości. W przeciwnym razie wstawia nowy wiersz z podanym identyfikatorem i nazwiskiem pracownika.

2. Korzystanie z funkcji RowCount

Ta metoda obejmuje najpierw uruchomienie instrukcji aktualizacji, a następnie instrukcja Wstaw, jeśli instrukcja aktualizacji nie zaktualizowała żadnych wierszy.

Rozpocznij transakcję
Deklaruj @EmployeEID int = 18;
Declare @Name varchar (max) = „sonalika”;
Zaktualizuj DBO.Pracownik z (UpdLock, serializable)
Ustaw nazwę = @Name
Gdzie empid = @EmployeEID
Jeśli @@ RowCount = 0
Włóż do DBO.Pracownik (empid, nazwa)
Wartości
(@EmployeEID, @Name)
Zatwierdzić transakcję;

Wyjście:

Nazwa empid depid sal
18 sonalika null null

Tutaj kod SQL próbuje zaktualizować nazwę pracownika z podanym identyfikatorem w tabeli za pomocą updLock i serializacji wskazówek, które nabywają wyłączną blokadę w wybranym wierszu. Jeśli aktualizacja nie wpływa na brak wierszy, kod wykonuje instrukcję Wstaw do wstawienia nowego wiersza z podanym identyfikatorem pracownika i wartościami nazwy.

3. Korzystanie z instrukcji scalania

Trzecim sposobem wykonania operacji upsert na serwerze SQL jest zastosowanie instrukcji scalania. Ta metoda łączy działania instrukcji wkładki i aktualizacji w jedno instrukcję, podobną do klauzuli ESTIS, ale z bardziej zaawansowanymi funkcjami.

Deklaruj @EmployeEID int = 18;
Declare @Name varchar (max) = „arnab”;
Scal dbo.Pracownik z (Holdlock) jako cel
Używając (wartości (@EmployeEID, @Name)) jako źródło (employeID, nazwa)
Na celu.Empid = Źródło.Dowód pracownika
Po dopasowaniu, a następnie zaktualizuj ustawiaj cel.Nazwa = źródło.Nazwa
Po nie dopasowanych wartości (empid, nazwa) wartości (źródło.Employeid, źródło.Nazwa);

Wyjście:

Nazwa empid depid sal
18 Arnab null null

To zapytanie SQL wykorzystuje instrukcję scalania, aby scalić dane z tabeli źródłowej w tabelę docelową. Dopasowuje rzędy między dwiema tabelami za pomocą „kolumny empid” i aktualizuje „kolumnę nazwy” w tabeli docelowej, jeśli znaleziono dopasowanie. Jeśli nie ma dopasowania, wkłada nowy rząd.

Wniosek

Operacje upsert są powszechnym wymogiem na serwerze SQL. Istnieje wiele sposobów ich osiągnięcia, w tym przy użyciu metody EXS, funkcji RowCount i instrukcji scalania. Możemy wybrać najlepsze podejście na podstawie naszych wymagań.