Wstawianie, aktualizowanie i usuwanie danych za pomocą korespondencji seryjnej
W SQL Server 2008, można wykonać insert, update lub operacji usuwania w pojedynczej instrukcja przy użyciu instrukcja korespondencji seryjnej.Instrukcja korespondencji seryjnej umożliwia łączyć danych źródło z tabela miejsce docelowe lub w widoku i wykonać wiele działania przeciwko docelowego na podstawie wyniki tej łączyć. Za pomocą instrukcji korespondencji seryjnej można na przykład wykonywać następujące operacje:
Warunkowo wstawić lub zaktualizować wiersze w tabela miejsce docelowe.
Jeśli wiersz w tabela miejsce docelowe, aktualizacja jednego lub więcej kolumn; w przeciwnym razie Wstaw dane do nowego wiersza.
Synchronizacja tabel.
Wstawianie, aktualizowanie lub usuwanie wierszy w tabela miejsce docelowe, oparte na różnicach z źródło danych.
Składnia korespondencji seryjnej składa się z pięciu klauzul podstawowego:
Klauzula seryjnej określa tabeli lub widoku, który jest miejsce docelowe wstawiania, aktualizacji lub usuwania operacji.
Za pomocą klauzula Określa źródło danych jest przyłączony do miejsce docelowe.
Klauzula ON określa warunki łączyć, które określają, gdzie miejsce docelowe i match źródła.
Klauzule podczas czynności podejmowane na podstawie wyniki klauzula ON i wszelkie dodatkowe kryteria wyszukiwania określonych w klauzulach podczas określ (DOPASOWANE, gdy nie DOPASOWANE przez docelową, a nie DOPASOWANE przez źródła).
Klauzula wyjścia zwraca wiersz dla każdego wiersza w miejsce docelowe , zostanie wstawiony, zaktualizowany lub usunięty.
Szczegółowe informacje dotyczące składni i reguł, zobacz SCAL (Transact-SQL).
Określanie źródłowego i docelowego warunków wyszukiwania
Ważne jest, aby zrozumieć, jak źródło i miejsce docelowe danych są scalane w jeden strumień wejściowy i jak dodatkowe kryteria wyszukiwania można filtrować poprawnie out zbędne wiersze.W przeciwnym razie można określić dodatkowe kryteria wyszukiwania w sposób, który dostarcza niewłaociwych wyniki.
Wiersze w źródle są dopasowane do wierszy w miejsce docelowe na podstawie predykatu łączyć określone w klauzula ON.Wynik jest Scalonej strumień wejściowy.Jeden insert, update lub operacji usuwania jest wykonywane na wiersz danych wejściowych.W zależności od określona w instrukcja klauzul podczas wprowadzania wierszy może być jeden z następujących:
Dobierzesz parę składający się z jednego wiersza z miejsce docelowe i jedną ze źródło.Jest to wynikiem KIEDY klauzula DOPASOWANE.
Wiersz źródło, nie ma żadnych odpowiedni wiersz w miejsce docelowe.Jest to wynikiem KIEDY nie DOPASOWANE przez docelowe klauzula.
Wiersz z miejsce docelowe o bez odpowiedniego wiersza w źródło.Jest to wynikiem KIEDY nie DOPASOWANE przez źródło klauzula.
Kombinacja KIEDY klauzul określona w instrukcja seryjnej określa typ łączyć, który jest implementowany przez procesor kwerend i wpływa na wyniki strumień wejściowy.Aby zilustrować, należy rozważyć następujący przykład źródła i miejsce docelowe danych i tabele.
USE tempdb;
GO
CREATE TABLE dbo.Target(EmployeeID int, EmployeeName varchar(10),
CONSTRAINT Target_PK PRIMARY KEY(EmployeeID));
CREATE TABLE dbo.Source(EmployeeID int, EmployeeName varchar(10),
CONSTRAINT Source_PK PRIMARY KEY(EmployeeID));
GO
INSERT dbo.Target(EmployeeID, EmployeeName) VALUES(100, 'Mary');
INSERT dbo.Target(EmployeeID, EmployeeName) VALUES(101, 'Sara');
INSERT dbo.Target(EmployeeID, EmployeeName) VALUES(102, 'Stefano');
GO
INSERT dbo.Source(EmployeeID, EmployeeName) Values(103, 'Bob');
INSERT dbo.Source(EmployeeID, EmployeeName) Values(104, 'Steve');
GO
W poniższej tabela przedstawiono typy łączyć możliwe i wskazuje, kiedy każdego typu jest implementowana przez optymalizator kwerendy.W tabela przedstawiono również wynikowy strumień wejściowy, na przykład źródło i tabel miejsce docelowe, kiedy kryterium wyszukiwania dopasowania źródło i docelowego danych jest Source.EmployeeID = Target.EmployeeID.
Typ połączenia |
Implementacja |
Przykład wyniki strumień wejściowy |
---|---|---|
SPRZĘŻENIE WEWNĘTRZNE |
KIEDY klauzula DOPASOWANE jest tylko określonej klauzuli gdy. |
SrcEmpID SrcName TrgEmpID TrgName -------- ------- -------- ------- NULL NULL NULL NULL |
LEWE SPRZĘŻENIE ZEWNĘTRZNE |
KIEDY nie DOPASOWANE przez docelowe klauzula jest określony, ale KIEDY nie klauzula DOPASOWYWANE przez źródło nie jest określony.KIEDY DOPASOWANE może lub nie może być określony. |
SrcEmpID SrcName TrgEmpID TrgName -------- ------- -------- -------100 Mary NULL NULL 101 Sara NULL NULL 102 Stefano NULL NULL |
PRAWE SPRZĘŻENIE ZEWNĘTRZNE |
KIEDY DOPASOWANE klauzula i KIEDY nie DOPASOWANE przez źródło klauzula są określone, ale KIEDY nie DOPASOWANO według klauzula docelowej nie jest określony. |
SrcEmpID SrcName TrgEmpID TrgName -------- ------- -------- -------NULL NULL 103 Bob NULL NULL 104 Steve |
PEŁNE SPRZĘŻENIE ZEWNĘTRZNE |
KIEDY nie klauzula DOPASOWYWANE przez docelowe i KIEDY nie DOPASOWANE przez źródło klauzula są określone.KIEDY DOPASOWANE może lub nie może być określony. |
SrcEmpID SrcName TrgEmpID TrgName -------- ------- -------- -------100 Mary NULL NULL 101 Sara NULL NULL 102 Stefano NULL NULL NULL NULL 103 Bob NULL NULL 104 Steve |
ANTY-SPRZĘŻENIE PÓŁTŁUSTEGO |
KIEDY nie klauzula DOPASOWYWANE przez źródło jest tylko określonej klauzuli gdy. |
TrgEmpID TrgName -------- ------- 100 Mary 101 Sara 102 Stefano |
Wyniki strumień wejściowy przykład wykazują, że wyniki strumień wejściowy zależą od kombinację klauzul i KIEDY.Załóżmy teraz, że chcesz wykonywać następujące akcje w tabela miejsce docelowe, w oparciu o ten strumień wejściowy:
Wstawianie wierszy z tabela źródłowej, kiedy zaczyna się pracownika identyfikator nie istnieje w tabela miejsce docelowe i nazwisko pracownika źródło na ".
Usuwanie wierszy w tabela miejsce docelowe, kiedy zaczyna się nazwa pracownika docelowego użytkownika " i pracownika, identyfikator nie istnieje w źródło tabela.
Aby wykonać te akcje, wymagane są następujące klauzule gdy:
NASTĘPNIE WSTAW, GDY NIE ZOSTAŁY DOPASOWANE PRZEZ OBIEKT DOCELOWY
NASTĘPNIE USUNĄĆ, GDY NIE ZOSTAŁY DOPASOWANE PRZEZ ŹRÓDŁO
Jak opisano w poprzedniej tabela, gdy zarówno KIEDY DOPASOWANE klauzule nie są określone, wynikowy strumień wejściowy jest pełne łączyć zewnętrzne źródła i miejsce docelowe tabele.Teraz, wyniki strumień wejściowy są znane, należy rozważyć sposób insert, update i delete akcje zostaną zastosowane do strumienia wejściowego.
Jak wspomniano wcześniej, gdy klauzul określić czynności podejmowane na podstawie wyniki klauzula ON i wszelkie dodatkowe kryteria wyszukiwania określonych w klauzulach gdy.W wielu przypadkach warunki wyszukiwania określone w klauzula ON wytwarza strumień wejściowy wymagane.Jednak w scenariuszu przykład akcje insert i delete wymagają dodatkowego filtrowania ograniczenie dotyczy wierszy do tych, których nazwisko pracownika, który rozpoczyna się od użytkownika ".W poniższym przykładzie kryteria filtrowania są stosowane do KIEDY nie DOPASOWANE przez docelowe i KIEDY nie DOPASOWANE przez źródło.Wyjście z instrukcja pokazuje, że oczekiwane wiersze z strumień wejściowy są poprawione, wstawiony lub usunięty.
-- MERGE statement with the join conditions specified correctly.
USE tempdb;
GO
BEGIN TRAN;
MERGE Target AS T
USING Source AS S
ON (T.EmployeeID = S.EmployeeID)
WHEN NOT MATCHED BY TARGET AND S.EmployeeName LIKE 'S%'
THEN INSERT(EmployeeID, EmployeeName) VALUES(S.EmployeeID, S.EmployeeName)
WHEN MATCHED
THEN UPDATE SET T.EmployeeName = S.EmployeeName
WHEN NOT MATCHED BY SOURCE AND T.EmployeeName LIKE 'S%'
THEN DELETE
OUTPUT $action, inserted.*, deleted.*;
ROLLBACK TRAN;
GO
Poniżej przedstawiono wyniki klauzula WYJŚCIOWEGO.
$action EmployeeID EmployeeName EmployeeID EmployeeName
--------- ----------- ------------ ----------- ------------
DELETE NULL NULL 101 Sara
DELETE NULL NULL 102 Stefano
INSERT 104 Steve NULL NULL
(3 row(s) affected)
Zmniejszanie liczby wierszy w strumień wejściowy w procesie określając warunek wyszukiwania dodatkowe klauzula na wczesnym (na przykład przez określenie ON Source.EmployeeID = Target.EmployeeID AND EmployeeName LIKE 'S%') może wydawać się, aby poprawić wydajność kwerendy.Jednakże może to spowodować nieprawidłowe i nieoczekiwane wyniki.Ponieważ warunki dodatkowe kryteria wyszukiwania, określone w klauzula ON nie są używane do dopasowania do źródła i miejsce docelowe danych, można je identyfikuje.
Poniższy przykład ilustruje sposób niepoprawne wyniki mogą wystąpić.Warunek wyszukiwania do dopasowania do źródła i miejsce docelowe obie tabele i warunek wyszukiwania dodatkowe filtrowania wierszy są określone w klauzula ON.Ponieważ warunek wyszukiwania dodatkowe nie jest wymagane do ustalenia źródło i operacje dopasowywania, insert i delete miejsce docelowe są stosowane do wprowadzania wszystkich wierszy.W efekcie warunek filtrowania EmployeeName LIKE 'S%' jest ignorowana.Podczas uruchamiania instrukcja produkcji inserted i deleted tabel pokazuje, że dwa wiersze są niepoprawnie zmodyfikował: Maria jest nieprawidłowo usuwany z tabela miejsce docelowe i Robert niepoprawnie jest wstawiany.
-- MERGE statement with join conditions that produce unexpected results.
USE tempdb;
GO
BEGIN TRAN;
MERGE Target AS T
USING Source AS S
ON (T.EmployeeID = S.EmployeeID AND T.EmployeeName LIKE 'S%'
AND S.EmployeeName LIKE 'S%' )
WHEN NOT MATCHED BY TARGET
THEN INSERT(EmployeeID, EmployeeName) VALUES(S.EmployeeID, S.EmployeeName)
WHEN MATCHED
THEN UPDATE SET T.EmployeeName = S.EmployeeName
WHEN NOT MATCHED BY SOURCE
THEN DELETE
OUTPUT $action, Inserted.*, Deleted.*;
ROLLBACK TRAN;
GO
Poniżej przedstawiono wyniki klauzula WYJŚCIOWEGO.
$action EmployeeID EmployeeName EmployeeID EmployeeName
--------- ----------- ------------ ----------- ------------
DELETE NULL NULL 100 Mary
DELETE NULL NULL 101 Sara
DELETE NULL NULL 102 Stefano
INSERT 103 Bob NULL NULL
INSERT 104 Steve NULL NULL
(wiersze 5 dotyczy)
Wytyczne warunek wyszukiwania
Warunki wyszukiwania używany do dopasowywania wierszy źródłowych i miejsce docelowe i warunki dodatkowe kryteria wyszukiwania są używane do filtrowania wierszy albo źródło lub miejsce docelowe musi być określona poprawnie dla zapewnienia, że poprawne wyniki są uzyskiwane.Zaleca się w następstwie wytycznych:
Określ tylko warunki wyszukiwania w ON <merge_search_condition> klauzula, które określają kryteria dopasowywania danych w źródle i miejsce docelowe tabele.Określ tylko te kolumny z tabela miejsce docelowe, które są porównywane odpowiednich kolumn źródło tabela.
Nie należy dołączać porównań inne wartości, takich jak stała.
Aby odfiltrować wiersze ze źródła lub miejsce docelowe tabel, użyj jednej z następujących metod:
Określ warunek wyszukiwania dla wiersza filtrowania w odpowiednich klauzula gdy.Na przykład WHEN NOT MATCHED AND S.EmployeeName LIKE 'S%' THEN INSERT....
Definiowanie widoku na źródło lub miejsce docelowe zwraca filtrowane wiersze i odwołania widoku jako źródło lub tabela miejsce docelowe.Jeśli widok jest zdefiniowana w tabela miejsce docelowe, wszelkie skargi muszą spełniać warunki uaktualniania widoków.Aby uzyskać więcej informacji na temat aktualizowania danych przy użyciu widoku, zobacz Modyfikowanie danych przy użyciu widoku.
Korzystać z <Typowe wyrażenie tabela> klauzula, aby odfiltrować wiersze ze źródła lub miejsce docelowe tabele.Ta metoda jest podobne do określania dodatkowe kryteria wyszukiwania w klauzula ON i może powodować nieprawidłowe wyniki.Zaleca się unikać stosowania tej metoda lub dokładnie przetestować przed jego wykonania.
Przykłady
A.Za pomocą prostej instrukcja korespondencji seryjnej do wykonywania operacji INSERT i UPDATE
Załóżmy, że masz FactBuyingHabits tabela bazy danych magazyn danych śledzący ostatnią data każdego odbiorca zakupił określonego produktu.Druga tabela Zakupy, w bazie danych OLTP rekordy zakupów w danym tygodniu.Każdego tygodnia, do którego chcesz dodać wiersze produktów określonych nabywców nigdy zakupionych przed z Zakupy tabela do FactBuyingHabits tabela.Wiersze klientów kupowanie produktów już zakupiły przed, po prostu chcesz aktualizować data zakupu w FactBuyingHabits tabela.Te Wstawianie i aktualizacja operacje mogą być wykonywane w pojedynczej instrukcja za pomocą korespondencji seryjnej.
Poniższy przykład tworzy najpierw tabel Purchases i FactBuyingHabits i ładuje je z niektórych danych przykładowych.Zwiększa wydajność w deklaracjach korespondencji seryjnej, gdy unikatowe indeksy są tworzone w kluczu łączyć, więc indeksy klastrowane są tworzone poprzez utworzenie ograniczenia klucz podstawowego na ProductID kolumna w obu tabelach.
In this example, Purchases contains purchases for the week of August 21, 2006.FactBuyingHabits contains purchases for the prior week; ordinarily this table would be populated with rows dating back much earlier.
USE AdventureWorks2008R2;
GO
IF OBJECT_ID (N'dbo.Purchases', N'U') IS NOT NULL
DROP TABLE dbo.Purchases;
GO
CREATE TABLE dbo.Purchases (
ProductID int, CustomerID int, PurchaseDate datetime,
CONSTRAINT PK_PurchProdID PRIMARY KEY(ProductID,CustomerID));
GO
INSERT INTO dbo.Purchases VALUES(707, 11794, '20060821'),
(707, 15160, '20060825'),(708, 18529, '20060821'),
(711, 11794, '20060821'),(711, 19585, '20060822'),
(712, 14680, '20060825'),(712, 21524, '20060825'),
(712, 19072, '20060821'),(870, 15160, '20060823'),
(870, 11927, '20060824'),(870, 18749, '20060825');
GO
IF OBJECT_ID (N'dbo.FactBuyingHabits', N'U') IS NOT NULL
DROP TABLE dbo.FactBuyingHabits;
GO
CREATE TABLE dbo.FactBuyingHabits (
ProductID int, CustomerID int, LastPurchaseDate datetime,
CONSTRAINT PK_FactProdID PRIMARY KEY(ProductID,CustomerID));
GO
INSERT INTO dbo.FactBuyingHabits VALUES(707, 11794, '20060814'),
(707, 18178, '20060818'),(864, 14114, '20060818'),
(866, 13350, '20060818'),(866, 20201, '20060815'),
(867, 20201, '20060814'),(869, 19893, '20060815'),
(870, 17151, '20060818'),(870, 15160, '20060817'),
(871, 21717, '20060817'),(871, 21163, '20060815'),
(871, 13350, '20060815'),(873, 23381, '20060815');
GO
Tabele są teraz wypełniona następujące dane:
dbo.Zakupy
ProductID CustomerID PurchaseDate
----------- ----------- -----------------------
707 11794 2006-08-20 00:00:00.000
707 15160 2006-08-25 00:00:00.000
708 18529 2006-08-21 00:00:00.000
711 11794 2006-08-20 00:00:00.000
711 19585 2006-08-22 00:00:00.000
712 14680 2006-08-26 00:00:00.000
712 21524 2006-08-26 00:00:00.000
712 19072 2006-08-20 00:00:00.000
870 15160 2006-08-23 00:00:00.000
870 11927 2006-08-24 00:00:00.000
870 18749 2006-08-25 00:00:00.000
dbo.FactBuyingHabits
ProductID CustomerID LastPurchaseDate
----------- ----------- -----------------------
707 11794 2006-08-14 00:00:00.000
707 18178 2006-08-18 00:00:00.000
864 14114 2006-08-18 00:00:00.000
866 13350 2006-08-18 00:00:00.000
866 20201 2006-08-15 00:00:00.000
867 20201 2006-08-14 00:00:00.000
869 19893 2006-08-15 00:00:00.000
870 17151 2006-08-18 00:00:00.000
870 15160 2006-08-17 00:00:00.000
871 21717 2006-08-17 00:00:00.000
871 21163 2006-08-15 00:00:00.000
871 13350 2006-08-15 00:00:00.000
873 23381 2006-08-15 00:00:00.000
Należy zwrócić uwagę na wspólne dla obu tabel są dwa wiersze nabywcy produktu: Klient 11794 zakupił 707 produktu podczas bieżącego tygodnia, jak również poprzedniego tygodnia i to samo dotyczy zakupu produktu 870 15160 klienta.Dla tych wierszy aktualizacji firma Microsoft FactBuyingHabits z data rejestrowane dla tych zakupów w Zakupy przy użyciu KIEDY następnie DOPASOWANE klauzula.Możemy wstawione wszystkie inne wiersze FactBuyingHabits przy użyciu KIEDY nie DOPASOWANO następnie klauzula.
MERGE dbo.FactBuyingHabits AS Target
USING (SELECT CustomerID, ProductID, PurchaseDate FROM dbo.Purchases) AS Source
ON (Target.ProductID = Source.ProductID AND Target.CustomerID = Source.CustomerID)
WHEN MATCHED THEN
UPDATE SET Target.LastPurchaseDate = Source.PurchaseDate
WHEN NOT MATCHED BY TARGET THEN
INSERT (CustomerID, ProductID, LastPurchaseDate)
VALUES (Source.CustomerID, Source.ProductID, Source.PurchaseDate)
OUTPUT $action, Inserted.*, Deleted.*;
B.Wykonanie operacji aktualizacji i usuwania
W poniższym przykładzie użyto korespondencji seryjnej, aby zaktualizować ProductInventory tabela w AdventureWorks2008R2 daily przykładowe bazy danych, na podstawie zamówień, które są przetwarzane w SalesOrderDetail tabela.Za pomocą następujących instrukcja korespondencji seryjnej, Quantity kolumna ProductInventory Tabela jest aktualizowana przez odjęcie liczby zamówień złożonych każdego dnia, dla każdego produktu.Jeżeli liczba zamówień dla produktu powoduje zapasów produktu do spadku 0 lub poniżej, skreśla się wiersz dla tego produktu ProductInventory tabela.Należy zauważyć, że źródło tabela jest zagregowany w ProductID kolumna.Jeśli zostały nie to, więcej niż jeden ProductID w źródle tabela może pasować do tabela miejsce docelowe i powodować scalania instrukcja zwraca błąd.
USE AdventureWorks2008R2;
GO
IF OBJECT_ID (N'Production.usp_UpdateInventory', N'P') IS NOT NULL DROP PROCEDURE Production.usp_UpdateInventory;
GO
CREATE PROCEDURE Production.usp_UpdateInventory
@OrderDate datetime
AS
MERGE Production.ProductInventory AS target
USING (SELECT ProductID, SUM(OrderQty) FROM Sales.SalesOrderDetail AS sod
JOIN Sales.SalesOrderHeader AS soh
ON sod.SalesOrderID = soh.SalesOrderID
AND soh.OrderDate = @OrderDate
GROUP BY ProductID) AS source (ProductID, OrderQty)
ON (target.ProductID = source.ProductID)
WHEN MATCHED AND target.Quantity - source.OrderQty <= 0
THEN DELETE
WHEN MATCHED
THEN UPDATE SET target.Quantity = target.Quantity - source.OrderQty,
target.ModifiedDate = GETDATE()
OUTPUT $action, Inserted.ProductID, Inserted.Quantity, Inserted.ModifiedDate, Deleted.ProductID,
Deleted.Quantity, Deleted.ModifiedDate;
GO
EXECUTE Production.usp_UpdateInventory '20030501'
C.Wykonywanie operacji INSERT, UPDATE i DELETE
W poniższym przykładzie użyto korespondencji seryjnej do wstawiania, aktualizacji lub usunięcia wierszy w tabela miejsce docelowe, oparte na różnicach z źródło danych.Rozważ Menedżer małej firmie z pięciu departamentów, każdy z działu.Firma decyduje się na re-organize jej służb.Wdrożenie wyniki reorganizacji w dbo tabela miejsce docelowe.Departamenty, instrukcja korespondencji seryjnej należy zaimplementować następujące zmiany:
Niektóre istniejące działy nie zmieni się.
Niektóre istniejące działy będą miały nowe menedżerów.
Nowo tworzone są niektóre działy.
Niektóre działy nie będą istniały po reorganizacji.
Poniższy kod tworzy miejsce docelowe tabeli dbo.Departments i wypełni je z menedżerów.
USE AdventureWorks2008R2;
GO
IF OBJECT_ID (N'dbo.Departments', N'U') IS NOT NULL
DROP TABLE dbo.Departments;
GO
CREATE TABLE dbo.Departments (DeptID tinyint NOT NULL PRIMARY KEY, DeptName nvarchar(30),
Manager nvarchar(50));
GO
INSERT INTO dbo.Departments
VALUES (1, 'Human Resources', 'Margheim'),(2, 'Sales', 'Byham'),
(3, 'Finance', 'Gill'),(4, 'Purchasing', 'Barber'),
(5, 'Manufacturing', 'Brewer');
Zmiany organizacyjne do służby są przechowywane w źródło tabela dbo.Departments_delta.Poniższy kod tworzy i wypełnia tę tabela:
USE AdventureWorks2008R2;
GO
IF OBJECT_ID (N'dbo.Departments_delta', N'U') IS NOT NULL
DROP TABLE dbo.Departments_delta;
GO
CREATE TABLE dbo.Departments_delta (DeptID tinyint NOT NULL PRIMARY KEY, DeptName nvarchar(30),
Manager nvarchar(50));
GO
INSERT INTO dbo.Departments_delta VALUES
(1, 'Human Resources', 'Margheim'), (2, 'Sales', 'Erickson'),
(3 , 'Accounting', 'Varkey'),(4, 'Purchasing', 'Barber'),
(6, 'Production', 'Jones'), (7, 'Customer Relations', 'Smith');
GO
Wreszcie, aby odzwierciedlić reorganizacji firmy w tabela miejsce docelowe, następujący kod używa instrukcja korespondencji seryjnej do porównywania źródło tabela, dbo.Departments_delta, z tabela miejsce docelowe dbo.Departments.Porównanie to warunek wyszukiwania jest zdefiniowany w klauzula w instrukcja.Na podstawie wyniki porównania, podejmowane są następujące akcje.
Służby, które istnieją w obu tabelach zostaną zaktualizowane w tabela miejsce docelowe, nowe nazwy, menedżerowie nowych lub zarówno w tabela Departments.Jeśli żadne zmiany, nic nie jest aktualizowany.Jest to realizowane w KIEDY następnie DOPASOWANE klauzula.
Działy w Departments_delta występujące w Departments są wstawiane do Departments.Jest to realizowane w KIEDY nie DOPASOWANO następnie klauzula.
Działy w Departments , nie istnieją w źródło tabela Departments_delta są usuwane z Departments.NIE, to jest realizowane w KIEDY DOPASOWANE przez źródło następnie klauzula.
MERGE dbo.Departments AS d
USING dbo.Departments_delta AS dd
ON (d.DeptID = dd.DeptID)
WHEN MATCHED AND d.Manager <> dd.Manager OR d.DeptName <> dd.DeptName
THEN UPDATE SET d.Manager = dd.Manager, d.DeptName = dd.DeptName
WHEN NOT MATCHED THEN
INSERT (DeptID, DeptName, Manager)
VALUES (dd.DeptID, dd.DeptName, dd.Manager)
WHEN NOT MATCHED BY SOURCE THEN
DELETE
OUTPUT $action,
inserted.DeptID AS SourceDeptID, inserted.DeptName AS SourceDeptName,
inserted.Manager AS SourceManager,
deleted.DeptID AS TargetDeptID, deleted.DeptName AS TargetDeptName,
deleted.Manager AS TargetManager;
Zobacz także