Udostępnij za pośrednictwem


Korespondencji SERYJNEJ (języka Transact-SQL)

Wykonuje wstawiania, aktualizacji lub operacji usuwania w tabela miejsce docelowe, na podstawie wyniki łączyć z urządzenie źródłowe tabela.Na przykład można synchronizować dwie tabele, wstawiania, aktualizowania lub usuwania wierszy w jednej tabela, oparte na różnice w drugiej tabela.

Topic link iconKonwencje składni języka Transact-SQL

[ WITH <common_table_expression> [,...n] ]
MERGE 
        [ TOP ( expression ) [ PERCENT ] ] 
        [ INTO ] <target_table> [ WITH ( <merge_hint> ) ] [ [ AS ] table_alias ]
        USING <table_source> 
        ON <merge_search_condition>
        [ WHEN MATCHED [ AND <clause_search_condition> ]
            THEN <merge_matched> ] [...n ]
        [ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]
            THEN <merge_not_matched> ]
        [ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]
            THEN <merge_matched> ] [...n ]
        [ <output_clause> ]
        [ OPTION ( <query_hint> [ ,...n ] ) ]    
;

<target_table> ::=
{ 
    [ database_name . schema_name . | schema_name . ]
    target_table
}

<merge_hint>::=
{
    { [ <table_hint_limited> [ ,...n ] ]
    [ [ , ] INDEX ( index_val [ ,...n ] ) ] }
}

<table_source> ::= 
{
        table_or_view_name [ [ AS ] table_alias ] [ <tablesample_clause> ] 
            [ WITH ( table_hint [ [ , ]...n ] ) ] 
    | rowset_function [ [ AS ] table_alias ] 
            [ ( bulk_column_alias [ ,...n ] ) ] 
    | user_defined_function [ [ AS ] table_alias ]
    | OPENXML <openxml_clause> 
    | derived_table [ AS ] table_alias [ ( column_alias [ ,...n ] ) ] 
    | <joined_table> 
    | <pivoted_table> 
    | <unpivoted_table> 
}

<merge_search_condition> ::=
    <search_condition>

<merge_matched>::=
    { UPDATE SET <set_clause> | DELETE }

<set_clause>::=
SET
    { column_name = { expression | DEFAULT | NULL }
  | { udt_column_name.{ { property_name = expression
                                              | field_name = expression }
                                              | method_name ( argument [ ,...n ] ) }
     }
  | column_name { .WRITE ( expression , @Offset , @Length ) }
  | @variable = expression
  | @variable = column = expression
  | column_name { += | -= | *= | /= | %= | &= | ^= | |= } expression
  | @variable { += | -= | *= | /= | %= | &= | ^= | |= } expression
  | @variable = column { += | -= | *= | /= | %= | &= | ^= | |= } expression
  } [ ,...n ] 

<merge_not_matched>::=
{
        INSERT [ ( column_list ) ] 
            { VALUES ( values_list )
            | DEFAULT VALUES }
}

<clause_search_condition> ::=
    <search_condition>

<search condition> ::=
        { [ NOT ] <predicate> | ( <search_condition> ) } 
        [ { AND | OR } [ NOT ] { <predicate> | ( <search_condition> ) } ] 
[ ,...n ] 

<predicate> ::= 
    { expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } expression 
    | string_expression [ NOT ] LIKE string_expression 
  [ ESCAPE 'escape_character' ] 
    | expression [ NOT ] BETWEEN expression AND expression 
    | expression IS [ NOT ] NULL 
    | CONTAINS 
    ( { column | * } , '< contains_search_condition >' ) 
    | FREETEXT ( { column | * } , 'freetext_string' ) 
    | expression [ NOT ] IN ( subquery | expression [ ,...n ] ) 
    | expression { = | < > | ! = | > | > = | ! > | < | < = | ! < } 
  { ALL | SOME | ANY} ( subquery ) 
    | EXISTS ( subquery ) } 

<output_clause>::=
{
        [ OUTPUT <dml_select_list> INTO { @table_variable | output_table }
            [ (column_list) ] ]
    [ OUTPUT <dml_select_list> ]
}

<dml_select_list>::=
        { <column_name> | scalar_expression } 
                [ [AS] column_alias_identifier ] [ ,...n ]

<column_name> ::=
        { DELETED | INSERTED | from_table_name } . { * | column_name }
      | $action

Argumenty

  • WITH common_table_expression < >
    Określa zestaw tymczasowy o nazwie wyników lub widok, znane również jako wspólne wyrażenie tabela, określonych w zakresie instrukcja korespondencji SERYJNEJ.Zestaw wyników jest określany na podstawie kwerendy prostej i odwołują się do instrukcja korespondencji SERYJNEJ.Aby uzyskać więcej informacji zobaczWITH common_table_expression (Transact-SQL).

  • TOP ( expression ) [%]
    Specifies the number or percentage of rows that are affected.expression can be either a number or a percentage of the rows.Wiersze, do którego odwołuje się wyrażenie TOP nie są rozmieszczone w dowolnej kolejności.Aby uzyskać więcej informacji zobaczTOP (Transact-SQL).

    Stosowana jest klauzula TOP w po cały urządzenie źródłowe tabelą i tabelą całego miejsce docelowe są połączone i sprzężonych wiersze, które nie kwalifikują się do wstawiania, aktualizacji lub usuwania akcja są usuwane.Dalsze klauzula TOP zmniejsza liczbę wierszy sprzężonych określona wartość i wstawiania, aktualizacji lub usuwania akcji są stosowane do pozostałych połączonych wierszy w sposób nieuporządkowana.Oznacza to nie istnieje żadne zlecenia, w którym umieszczone są wiersze akcji, zdefiniowanych w klauzulach podczas.Na przykład określając TOP (10) wpływa na wiersze 10; tych wierszy, 7 może zostać zaktualizowany i dodaje 3 lub 1 może być usunięty, zaktualizowane 5, a 4 wstawione i tak dalej.

    Ponieważ instrukcja korespondencji SERYJNEJ wykonuje skanowanie pełne tabela źródłowej i miejsce docelowe tabel, wydajność wejścia/wyjścia mogą mieć wpływ podczas modyfikowania tabela dużych tworząc wiele instancji przy użyciu klauzula TOP.W tym scenariuszu, ważne jest upewnić się, że wszystkie kolejne instancje miejsce docelowe nowe wiersze.Aby uzyskać więcej informacji zobaczOptimizing MERGE Statement Performance.

  • database_name
    Jest to nazwa bazy danych, w którym target_table znajduje się.

  • schema_name
    Jest to nazwa schematu, do którego target_table należy.

  • target_table
    Is the table or view against which the data rows from <table_source> are matched based on <clause_search_condition>.target_table is the target of any insert, update, or delete operations specified by the WHEN clauses of the MERGE statement.

    Jeśli target_table jest to widok każdej akcji przed nim muszą spełniać warunki w celu zaktualizowania widoków. Aby uzyskać więcej informacji zobaczModifying Data Through a View.

    target_table cannot be a remote table.target_table cannot have any rules defined on it.

  • [] table_alias
    Czy alternatywną nazwą używać do odwoływania się tabela.

  • KORZYSTANIA table_source < >
    Określa urządzenie źródłowe danych, które są dopasowywane z wierszy danych w target_table na podstawie <warunek merge_search>. The result of this match dictates the actions to take by the WHEN clauses of the MERGE statement.<table_source> can be a remote table or a derived table that accesses remote tables.

    <table_source> can be a derived table that uses the Transact-SQLtable value constructor to construct a table by specifying multiple rows.

    Aby uzyskać więcej informacji na temat składnię i argumenty tę klauzulę zobacz FROM (Transact-SQL).

  • ON merge_search_condition < >
    Określa warunki, w którym <table_source> jest połączony z target_table Aby określić, których odpowiadają.

    Ostrzeżenie

    Ważne jest określić tylko kolumny z tabela miejsce docelowe, które są używane do celów dopasowania.Oznacza to, określ kolumna z tabela miejsce docelowe, które są porównywane z odpowiednią kolumna urządzenie źródłowe tabela.Nie należy próbować zwiększyć wydajność kwerendy odfiltrowując wierszy w tabela miejsce docelowe w klauzula ON na przykład przez określenie AND NOT target_table.column_x = value. W ten sposób może zwracać niepoprawne i nieoczekiwane wyniki.

  • GDY DOPASOWYWANE THEN merge_matched < >
    Określa, że wszystkie wiersze target_table pasujących do wierszy zwracanych przez <table_source> DALEJ <merge_search_condition>i spełniają wszelkie dodatkowe warunek wyszukiwania, są aktualizowane lub usuwane z <merge_matched> Klauzula.

    Instrukcja korespondencji SERYJNEJ może mieć co najwyżej dwa, KIEDY UZGODNIĆ klauzul.Jeśli podano dwie klauzule, następnie Pierwsza klauzula musi towarzyszyć AND <search_condition> Klauzula. Dla każdego danego wiersza drugi po MATCHED klauzula jest stosowane tylko, jeśli nie jest pierwszym.Jeśli istnieją dwie, KIEDY UZGODNIĆ klauzule, a następnie jeden musi określić akcja UPDATE i jeden musi określać akcja DELETE.Jeśli UPDATE jest określony w <merge_matched> Klauzula i więcej niż jeden wiersz <table_source>pasuje do wiersza target_table na podstawie <merge_search_condition>, SQL Server Zwraca błąd. Instrukcja korespondencji SERYJNEJ nie więcej niż jeden raz, aktualizować tym samym wierszu lub aktualizować i usuwać tym samym wierszu.

  • KIEDY nie można UZGODNIĆ [BY miejsce docelowe] THEN < merge_not_matched >
    Określa, że wiersz jest wstawiany target_table dla każdego wiersza zwracana przez <table_source> DALEJ <merge_search_condition> nie odpowiada wierszowi w target_table, ale spełnia dodatkowych warunek wyszukiwania, jeśli jest obecna. Wartości do wstawiania są określane przez <merge_not_matched> Klauzula. Instrukcja korespondencji SERYJNEJ może mieć tylko jeden, gdy nie MATCHED klauzula.

  • Jeśli nie są DOPASOWYWANE urządzenie źródłowe THEN merge_matched < >
    Określa, że wszystkie wiersze target_table które nie pasują do wierszy zwracanych przez <table_source> DALEJ <merge_search_condition>, a które spełnia warunek wszelkie dodatkowe kryteria wyszukiwania, są zaktualizowane lub usunięte zgodnie z <merge_matched> Klauzula.

    Instrukcja korespondencji SERYJNEJ może mieć co najwyżej dwa podczas nie PASUJE BY urządzenie źródłowe klauzul.Jeśli podano dwie klauzule, następnie Pierwsza klauzula musi towarzyszyć AND <clause_search_condition> Klauzula. Dla dowolnego danego wiersza, gdy drugi nie DOPASOWANE przez urządzenie źródłowe klauzuli jest stosowane tylko, jeśli nie jest pierwszym.Jeśli istnieją dwie podczas nie PASUJE BY urządzenie źródłowe klauzule, a następnie jeden musi określić akcja UPDATE i jedną muszą określać akcja DELETE.Można odwoływać się tylko kolumny z tabela miejsce docelowe w <clause_search_condition>.

    Jeśli wiersze nie są zwracane przez <table_ urządzenie źródłowe>, kolumny w urządzenie źródłowe nie można uzyskać dostępu do tabela. Jeśli określono akcja aktualizację lub usunięcie <merge_matched> klauzula odwołuje się do kolumn w urządzenie źródłowe tabela, zwracany jest błąd 207 (kolumna nieprawidłowa nazwa). Na przykład klauzula WHEN NOT MATCHED BY SOURCE THEN UPDATE SET TargetTable.Col1 = SourceTable.Col1 może spowodować, że instrukcja aby zakończyć się niepowodzeniem, ponieważ Col1 urządzenie źródłowe tabela jest niedostępny.

  • I clause_search_condition < >
    Określa każdy warunek wyszukiwania prawidłowy.Aby uzyskać więcej informacji zobaczSearch Condition (Transact-SQL).

  • <table_hint_limited>
    Określa wskazówki tabela, które są stosowane w tabela miejsce docelowe dla każdej z wstawiania, aktualizacji lub usuwania akcji, które są wykonywane przez instrukcję korespondencji SERYJNEJ.Słowo kluczowe WITH i nawiasy są wymagane.

    NOLOCK i READUNCOMMITTED nie są dozwolone.Aby uzyskać więcej informacji na temat wskazówek dotyczących tabela zobacz Wskazówki do tabela (języka Transact-SQL).

    Określanie TABLOCK wskazówki dla tabela, która jest miejsce docelowe instrukcja INSERT ma ten sam efekt jak określanie wskazówka TABLOCKX.W tabela jest pobierana wyłącznej blokada.Po określeniu FORCESEEK dotyczy niejawna wystąpienie tabela miejsce docelowe, połączone z tabela źródłowej.

    Ostrzeżenie

    Określanie READPAST z, KIEDY nie UZGODNIĆ [BY miejsce docelowe] THEN INSERT może spowodować INSERT operacje, które naruszają ograniczenia UNIQUE.

  • Indeks (index_val [,.. .n])
    Określa nazwę lub identyfikator jednego lub kilku indeksów w tabela miejsce docelowe, do wykonywania łączyć niejawna z urządzenie źródłowe tabela.Aby uzyskać więcej informacji zobaczWskazówki do tabela (języka Transact-SQL).

  • <output_clause>
    Zwraca wiersz dla każdego wiersza w target_table jest aktualizowany, wstawione lub usunięte w losowej kolejności. Aby uzyskać więcej informacji na temat argumentów tego klauzula, zobacz Klauzula OUTPUT (języka Transact-SQL).

  • Opcja (query_hint < > [,.. .n])
    Określa, że wskazówek dotyczących optymalizacji są używane do dostosowywania sposób instrukcja przetwarzania aparat bazy danych.Aby uzyskać więcej informacji zobaczQuery Hints (Transact-SQL).

  • <merge_matched>
    Określa aktualizację lub usunięcie akcja, która jest stosowana do wszystkich wierszy target_table które nie pasują do wierszy zwracanych przez <table_source> DALEJ <merge_search_condition>, a które spełniają warunek wszelkie dodatkowe kryteria wyszukiwania.

    • UPDATE zestaw set_clause < >
      Określa listę kolumn lub nazwy zmiennych, które mają być aktualizowane w tabela miejsce docelowe i wartości, dla których należy je zaktualizować.

      Aby uzyskać więcej informacji na temat argumentów tego klauzula, zobacz UPDATE (Transact-SQL). Ustawiając zmienną na tę samą wartość jak kolumna nie jest dozwolona.

    • USUWANIE
      Określa, że odpowiadające wierszy w wiersze target_table zostaną usunięte.

  • <merge_not_matched>
    Określa wartości, aby wstawić do tabela miejsce docelowe.

    • ( column_list )
      Jest to lista jednego lub kilku kolumn w tabela miejsce docelowe, w którym chcesz wstawić dane.Columns must be specified as a single-part name or else the MERGE statement will fail.column_list must be enclosed in parentheses and delimited by commas.

    • VALUES ( values_list )
      Jest rozdzielana przecinkami lista stałych, zmiennych lub wyrażeń, które zwracają wartości, aby wstawić do tabela miejsce docelowe.Wyrażenia nie mogą zawierać instrukcja wykonać.

    • WARTOŚCI DOMYŚLNE
      Wymusza wstawionego wiersza na zawierają wartości domyślne zdefiniowane dla każdej kolumna.

    Aby uzyskać więcej informacji na ten temat klauzula, zobacz INSERT (Transact-SQL).

  • <warunek wyszukiwania>
    Określa używany do określania warunków wyszukiwania <merge_search_condition> lub <clause_search_condition>. Aby uzyskać więcej informacji na temat argumentów tę klauzulę zobacz Search Condition (Transact-SQL).

Remarks

Należy określić co najmniej jeden z trzech klauzule MATCHED, ale można je określić w dowolnej kolejności.Zmienna nie można zaktualizować więcej niż jeden raz w tej samej klauzula MATCHED.

Wszelkie wstawiania, aktualizacji lub akcje usuwania określonych w tabela miejsce docelowe w instrukcja korespondencji SERYJNEJ są ograniczone przez wszystkich ograniczeń zdefiniowanych, tym kaskadowych ograniczenia integralność referencyjnej.Jeśli jest IGNORE_DUP_KEY zestaw on żadnych unikatowych indeksów w tabela miejsce docelowe, korespondencji SERYJNEJ ignoruje to ting zestaw.

Instrukcja korespondencji SERYJNEJ wymaga średnik (;) jako terminator instrukcji.Błąd 10713 jest wywoływane, gdy instrukcja korespondencji SERYJNEJ jest uruchamiany bez terminator.

Gdy po korespondencji SERYJNEJ, @@ROWCOUNT (Transact-SQL) Zwraca wartość całkowitą liczbę wierszy wstawiane, aktualizowane i usunięty klient.

Korespondencji SERYJNEJ jest całkowicie zastrzeżonym słowem kluczowym, gdy poziom zgodności bazy danych jest zestaw do 100.Instrukcja korespondencji SERYJNEJ jest dostępnych w ramach zarówno 90-100 poziomów zgodności bazy danych; jednak słowo kluczowe nie jest całkowicie rezerwowany wówczas, gdy poziom zgodności bazy danych jest równa 90.

Implementacja wyzwalacza

Dla każdego wstawiania aktualizacji lub usuwania akcja określoną w instrukcja korespondencji SERYJNEJ SQL Server uruchomieniu dowolnego odpowiadające później wyzwalacze zdefiniowane w tabela miejsce docelowe, ale nie gwarantuje na akcja do ognia wyzwalacze pierwszy lub ostatni. Wyzwalaczy zdefiniowany dla tego samego akcja przestrzegać kolejności, należy określić.Aby uzyskać więcej informacji na temat ustawiania kolejność uruchamiania wyzwalaczy zobacz Określenie pierwszej i ostatniej wyzwalaczy.

Jeśli w tabela miejsce docelowe włączonych a nie z wyzwalacza zdefiniowanego na nim dla wstawiania, aktualizacji lub usuwania wykonaną przez instrukcję korespondencji SERYJNEJ, a następnie musi ona mieć włączonych a nie z wyzwalacza dla wszystkich akcja, określona w instrukcja korespondencji SERYJNEJ.

Jeśli jest każdy Z INSTEAD UPDATE lub DELETE INSTEAD Z wyzwalaczy zdefiniowany na target_table, nie są wykonywane operacje aktualizację lub usunięcie. Zamiast tego, pożaru wyzwalacze i inserted i deleted tabele są odpowiednio wypełnione.

W przypadku dowolnej Z INSTEAD INSERT wyzwalaczy zdefiniowany na target_table, nie jest wykonywana operacja wstawiania. Zamiast tego, pożaru wyzwalacze i inserted Tabela jest pusta, odpowiednio.

Uprawnienia

Wymaga uprawnienie SELECT na tabela źródłowej i INSERT, UPDATE lub DELETE uprawnienia w tabela miejsce docelowe.Aby uzyskać dodatkowe informacje, zobacz temat w sekcji uprawnienia WYBIERZ OPCJĘ, WSTAWIANIE, AKTUALIZACJA, and USUWANIE tematów.

Przykłady

A.Do wykonywania operacji INSERT i UPDATE dla tabela w pojedynczej instrukcja przy użyciu korespondencji SERYJNEJ

Zwykłego scenariusza jest aktualizacja jednego lub kilku kolumn w tabela, jeśli istnieje dla niego odpowiedni wiersz lub wstawianie danych jako nowy wiersz, jeżeli nie istnieje odpowiedni wiersz.Zwykle można to zrobić, przekazując parametry do procedura przechowywana, która zawiera odpowiednie instrukcje UPDATE i INSERT.Przy użyciu instrukcja korespondencji SERYJNEJ można wykonać obu zadań w pojedynczej instrukcja.W poniższym przykładzie pokazano procedura przechowywana, która zawiera zarówno instrukcja INSERT i instrukcja SQL UPDATE.Procedura jest następnie zmodyfikowane tak, aby wykonywać operacje równoważne przy użyciu pojedynczej instrukcja korespondencji SERYJNEJ.

B.Za pomocą korespondencji SERYJNEJ do wykonywania UPDATE i DELETE operacji na tabela znajdującej się w pojedynczej instrukcja

W poniższym przykładzie użyto korespondencji SERYJNEJ, aby zaktualizować ProductInventory Tabela w AdventureWorks Przykładowa baza danych codziennie, na podstawie zamówień, które są przetwarzane w SalesOrderDetail Tabela. The Quantity kolumna of the ProductInventory tabela is updated by subtracting the number of orders placed each day for each product in the SalesOrderDetail tabela. Jeśli liczba zamówień dla produktu spadnie zapasów poziom produktu na 0 lub mniej, wiersz dotyczący tego produktu jest usuwany z ProductInventory Tabela.

C.Za pomocą korespondencji SERYJNEJ do wykonywania UPDATE i INSERT operacji w tabela miejsce docelowe przy użyciu tabela pochodnej urządzenie źródłowe

W poniższym przykładzie użyto korespondencji SERYJNEJ, aby zmodyfikować SalesReason Tabela uaktualniania lub wstawiania wierszy. Gdy wartość NewName w urządzenie źródłowe tabela odpowiada wartości w Name kolumny w tabela miejsce docelowe)SalesReason), ReasonType Kolumna jest aktualizowany w tabela miejsce docelowe. Gdy wartość NewName nie, nie pasuje, wiersz urządzenie źródłowe jest wstawiany do tabela miejsce docelowe. Tabela źródłowa jest tabeli pochodnej, która korzysta z Transact-SQL Konstruktor wartość tabeli do określenia wielu wierszy w tabeli źródłowej. Aby uzyskać więcej informacji na temat w tabela pochodnej przy użyciu konstruktora wartość tabela zobacz Konstruktor wartość tabela.W przykładzie przedstawiono również sposób do przechowywania wyników klauzula wyjście w zmiennej tabela, a następnie podsumować wyniki statment korespondencji SERYJNEJ, wykonując prosty, wybierz operację, która zwraca liczbę wierszy wstawianych i zaktualizowane.

D.Wstawianie wyniki instrukcja korespondencji SERYJNEJ do innej tabela

W poniższym przykładzie przechwytuje dane zwrócone z klauzula wyjście instrukcja korespondencji SERYJNEJ i wstawia dane do innej tabela.Aktualizacje instrukcja korespondencji SERYJNEJ Quantity Kolumna ProductInventory Tabela, na podstawie zamówień, które są przetwarzane w SalesOrderDetail Tabela. W przykładzie zawiera wiersze, które są aktualizowane i wstawia je do innej tabela, który jest używany do śledzenia zmian stanu.

Dodatkowe przykłady odnoszą się do Wstawianie, aktualizowanie i usuwanie danych przy użyciu korespondencji SERYJNEJ i Optimizing MERGE Statement Performance.