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;