- 20.08.2019
- 25 minuter att läsa
-
- X
- c
- j
- r
- a
-
+18
Gäller för: SQL Server (alla versioner som stöds) Azure SQL Database Azure Synapse Analytics
Kör infoga, uppdatera eller ta bort åtgärder i en måltabell från resultaten av en gå med en källtabell. Synkronisera till exempel två tabeller genom att infoga, uppdatera eller ta bort rader i en tabell baserat på skillnader som finns i den andra tabellen.
Obs
MERGE är för närvarande i förhandsgranskning för Azure Synapse Analytics.
Prestandatips: Det villkorliga beteende som beskrivs för MERGE-satsen fungerar bäst när de två tabellerna har en komplex blandning av matchande egenskaper. Att till exempel infoga en rad om den inte finns, eller uppdatera en rad om den matchar. När du bara uppdaterar en tabell baserat på raderna i en annan tabell, förbättrar du prestanda och skalbarhet med grundläggande INSERT-, UPDATE- och DELETE-uttalanden. exempel:
Transakt-SQL-syntaxkonventioner
Syntax
Obs
Om du vill visa Transact-SQL-syntax för SQL Server 2014 och tidigare, se dokumentation om tidigare versioner.
Argument
MED < common_table_expression >
Anger den tillfälliga namngivna resultatuppsättningen eller vyn, även känd som vanligt tabelluttryck, som definieras inom ramen för MERGE-uttalandet. Resultatsatsen härrör från en enkel fråga och refereras till i MERGE-uttalandet. Mer information finns i MED gemensam_tabelluttryck (Transact-SQL).
TOP (uttryck)
Anger antalet eller andelen berörda rader. uttryck kan vara antingen ett tal eller en procentandel av raderna. Raderna som refereras till i TOP-uttrycket är inte ordnade i någon ordning. Mer information finns i TOP (Transact-SQL).
TOP-klausulen gäller efter att hela källtabellen och hela måltabellen går med och de sammanfogade raderna som inte kvalificerar sig för en infogning, uppdatering eller borttagningsåtgärd tas bort. TOP-klausulen minskar ytterligare antalet sammanfogade rader till det angivna värdet. Åtgärderna infoga, uppdatera eller ta bort gäller för de återstående sammanfogade raderna på ett oordnat sätt. Det vill säga det finns ingen ordning i vilken rader fördelas mellan de åtgärder som definieras i WHEN-klausulerna. Om du till exempel anger TOP (10) påverkas 10 rader. Av dessa rader kan 7 uppdateras och 3 infogas, eller 1 kan raderas, 5 uppdateras och 4 infogas och så vidare.
Eftersom MERGE-satsen gör en fullständig tabellavsökning av både källan och måltabeller påverkas ibland I / O-prestanda när du använder TOP-klausulen för att ändra en stor tabell genom att skapa flera satser. I det här scenariot är det viktigt att se till att alla på varandra följande satser inriktas på nya rader.
databasnamn
Namnet på databasen där måltabellen finns.
schema_namn
Namnet på schemat som måltabell tillhör.
mål_tabell
Tabellen eller vyn mot vilken dataraderna från < tabellkälla > matchas baserat på < clause_search_condition >. target_table är målet för alla infoga, uppdatera eller ta bort operationer specificeras av WHEN-klausulerna i MERGE-satsen.
Om target_table är en vy måste alla åtgärder mot den uppfylla villkoren för att uppdatera vyer. Mer information finns i Modify Data Through a View.
target_table kan inte vara en fjärrbord. target_table kan inte ha några regler definierade.
table_alias
Ett alternativt namn för att referera till en tabell för target_table.
ANVÄNDNING < table_source >
Anger datakällan som matchas med datorraderna i måltabellen baserat på < merge_search-tillstånd >. Resultatet av denna match dikterar de åtgärder som ska vidtas av WHEN-klausulerna i MERGE-uttalandet. < table_source > kan vara en fjärrtabell eller en härledd tabell som får åtkomst till fjärrtabeller.
< table_source > kan vara en härledd tabell som använder Transact-SQL-tabellvärdekonstruktören för att konstruera en tabell genom att ange flera rader.
table_alias – Ett alternativt namn för att referera till en tabell för tabellkällan.
För mer information om syntaxen och argumenten för denna klausul, se FROM (Transact-SQL).
PÅ < merge_search_condition >
Anger de villkor som < table_source > ansluter till måltabellen för att avgöra var de matchar.
Varning
Det är viktigt att bara ange kolumnerna från måltabellen som ska användas för matchningsändamål. Det vill säga ange kolumner från måltabellen som jämförs med motsvarande kolumn i källtabellen. Försök inte förbättra sökfrågan genom att filtrera bort rader i måltabellen i ON-klausulen; till exempel som att specificera AND NOT target_table.column_x = value
. Om du gör det kan det resultera i oväntade och felaktiga resultat.
NÄR MATCHAD DÄR < merge_matched >
Anger att alla rader av * target_table, som matchar raderna som returneras av < table_source > ON < merge_search_condition >, och uppfyller alla ytterligare sökvillkor, uppdateras eller raderas enligt < merge_matched > klausul.
MERGE-uttalandet kan högst ha två NÄR MATCHED-klausuler. Om två klausuler specificeras måste den första klausulen åtföljas av en AND < sökvillkor > -klausul. För en viss rad tillämpas den andra WHEN MATCHED-satsen bara om den första inte är det. Om det finns två WHEN MATCHED-satser måste man ange en UPDATE-åtgärd och man måste ange en DELETE-åtgärd. När UPDATE anges i < merge_matched > sats och mer än en rad med < tabellkälla > matchar en rad i måltabellen baserat på < merge_search_condition >, SQL Server returnerar ett fel. MERGE-uttalandet kan” t uppdatera samma rad mer än en gång, eller uppdatera och ta bort samma rad.
NÄR DET ÄR INTE MATCHAD < merge_not_matched >
Anger att en rad infogas i måltabellen för varje rad som returneras av < table_source > PÅ < merge_search_condition > som inte matchar en rad i targ et_table, men uppfyller ett ytterligare sökvillkor, om det finns. Värdena som ska infogas anges av < merge_not_matched > -satsen. MERGE-satsen kan bara ha en SÄNDNING när den inte matchas.
NÄR den inte matchas av källan < merge_matched >
Anger att alla rader av * target_table, som inte matchar raderna som returneras av < table_source > ON < merge_search_condition >, och som uppfyller alla ytterligare sökvillkor, uppdateras eller raderas enligt < merge_matchad > -klausul.
MERGE-uttalandet kan ha högst två när det inte matchas av källklausuler. Om två klausuler anges måste den första klausulen åtföljas av en AND < klausul_sök_condition > -klausul. För en viss rad tillämpas den andra när den inte matchas av källan endast om den första inte är t. Om det finns två SÄNDNINGAR SOM INTE MATCHES PÅ KÄLLA, måste man ange en UPDATE-åtgärd och man måste ange en DELETE-åtgärd. Endast kolumner från måltabellen kan refereras i < clause_search_condition >.
När inga rader returneras av < table_source >, kolumner i källtabellen kan inte nås. Om uppdaterings- eller raderingsåtgärden som anges i < merge_matched > klausuler refererar till kolumner i källtabellen, fel 207 (Ogiltigt kolumnnamn) returneras. Till exempel klausulen WHEN NOT MATCHED BY SOURCE THEN UPDATE SET TargetTable.Col1 = SourceTable.Col1
kan orsaka att uttalandet misslyckas eftersom Col1
i källtabellen är otillgänglig.
OCH < clause_search_condition >
Anger alla giltiga sökvillkor. Mer information finns i sökvillkor (Transact-SQL).
< table_hint_limited >
Anger en eller flera tabelltips som ska tillämpas på måltabellen för var och en av dessa e infoga, uppdatera eller ta bort åtgärder som görs av MERGE-uttalandet. Nyckelordet WITH och parenteser krävs.
NOLOCK och READUNCOMMITTED är inte tillåtna. Mer information om tabelltips finns i Tabelltips (Transact-SQL).
Att ange TABLOCK-antydan på en tabell som är målet för ett INSERT-uttalande har samma effekt som att ange TABLOCKX-antydan. Ett exklusivt lås tas på bordet. När FORCESEEK specificeras gäller det den implicita instansen av måltabellen som är förenad med källtabellen.
Varning
Om du anger READPAST med NÄR INTE MATCHAS DÄR INSERT kan resultera i INSERT-operationer som bryter mot UNIKA begränsningar.
INDEX (index_val)
Anger namn eller ID för ett eller flera index i måltabellen för att göra en implicit koppling till källtabellen. Mer information finns i Tabell Tips (Transact -SQL).
< output_clause >
Returnerar en rad för varje rad i måltabellen som ”s uppdateras, infogas eller tas bort, i ingen särskild ordning. $ action kan anges i utgångssatsen. $ action är en kolumn av typen nvarchar (10) som returnerar ett av tre värden för varje rad: ”INSERT”, ”UPDATE” eller ”DELETE”, enligt den åtgärd som utförts på den raden. Mer information om argumenten och beteendet för denna klausul finns i OUTPUT-klausulen (Transact-SQL).
< merge_matched >
Anger den uppdaterings- eller raderaåtgärd som ”tillämpas på alla rader i måltabellen som inte matchar raderna som returneras av < tabellkälla > PÅ < merge_search_condition >, och som uppfyller alla ytterligare sökvillkor.
UPDATE SET < set_clause >
Anger listan över kolumn- eller variabelnamn som ska uppdateras i måltabellen och de värden som ska uppdateras.
Mer information om argumenten för denna klausul finns i UPDATE (Transact-SQL). Att ställa in en variabel till samma värde som en kolumn stöds inte.
DELETE
Anger att raderna som matchar rader i måltabellen raderas.
< merge_not_matched >
Anger värdena som ska infogas i måltabellen.
(kolumnlista)
En lista över en eller fler kolumner i måltabellen där data ska infogas. Kolumner måste anges som ett enstaka namn eller annars kommer MERGE-uttalandet att misslyckas. kolumnlista måste vara inom parentes och avgränsas med kommatecken.
VÄRDEN ( values_list) – En kommaseparerad lista över konstanter, variabler eller uttryck som returnerar värden att infoga i måltabellen. Uttryck kan inte innehålla ett EXECUTE-uttalande.
STANDARDVÄRDEN
Tvingar infogad rad för att innehålla standardvärdena definierade för varje kolumn.
Mer information om denna klausul finns i INSERT (Transact-SQL).
< search_condition >
Speci anpassar sökvillkoren för att specificera < merge_search_condition > eller < clause_search_condition >. Mer information om argumenten för denna klausul finns i Sökvillkor (Transact-SQL).
< diagramsökmönster >
Specificerar grafmatchningsmönstret. Mer information om argumenten för denna klausul finns i MATCH (Transact-SQL)
Anmärkningar
Obs
I Azure Synapse Analytics, MERGE kommando (förhandsvisning) har följande skillnader jämfört med SQL-server och Azure SQL-databas.
- En MERGE-uppdatering implementeras som ett par för att ta bort och infoga. Det berörda radantalet för en MERGE-uppdatering inkluderar de raderade och infogade raderna.
- Under förhandsgranskningen stöds inte tabeller med identitetskolumn av kommandot Synapse SQL MERGE.
- Stöd för tabeller med olika distributionstyper beskrivs i denna tabell:
MERGE CLAUSE i Azure Synapse Analytics TARGE-distributionstabell som stöds SOURCE-distributionstabell som stöds Kommentar NÄR MATCHAD Alla distributionstyper Alla distributionstyper matchas INTE MED MÅL HASH Alla distributionstyper Använd UPDATE / DELETE FROM … JOIN för att synkronisera två tabeller. matchas INTE AV KÄLLA Alla distributionstyper Alla distributionstyper
Minst en av de tre MATCHED-satserna måste anges, men de kan anges i valfri ordning. En variabel kan inte uppdateras mer än en gång i samma MATCHED-sats.
Alla infoga, uppdatera eller ta bort åtgärder som anges i måltabellen av MERGE-satsen är begränsade av alla begränsningar som definieras i den, inklusive alla kaskade referensintegritetsbegränsningar. Om IGNORE_DUP_KEY är PÅ för några unika index på måltabellen ignorerar MERGE denna inställning.
MERGE-satsen kräver ett semikolon (;) som en siktsterminator. Fel 10713 tas upp när ett MERGE-uttalande körs utan terminator.
När det används efter MERGE returnerar @@ ROWCOUNT (Transact-SQL) det totala antalet rader som har infogats, uppdaterats och raderats till klienten.
MERGE är ett helt reserverat nyckelord när databaskompatibilitetsnivån är inställd på 100 eller högre. MERGE-uttalandet finns tillgängligt under både 90 och 100 databaskompatibilitetsnivåer; dock är nyckelordet inte helt reserverat när databaskompatibilitetsnivån är inställd på 90.
Använd inte MERGE-satsen när du använder en replikering i uppdatering i kö. MERGE och köuppdateringsutlösaren är inte kompatibla. Ersätt MERGE-uttalandet med ett infog eller ett uppdateringsuttal.
Trigger Implementation
För varje insats, uppdatering eller radering som anges i MERGE-satsen, SQL Server avfyrar motsvarande AFTER-utlösare definierade i måltabellen, men garanterar inte vilken åtgärd som ska utlösas utlöser först eller sist. Utlösare definierade för samma åtgärd respekterar den ordning du anger. För mer information om inställning av triggerfyrningsordning, se Ange första och sista utlösare.
Om måltabellen har en aktiverad INSTEAD OF-utlösare definierad för en insats, uppdatering eller radering som utförs av ett MERGE-uttalande måste den ha en aktiverad INSTEAD OF-utlösare för alla de åtgärder som anges i MERGE-satsen.
Om någon INSTEAD OF UPDATE eller INSTEAD OF DELETE-utlösare definieras på target_table, är uppdaterings- eller raderingsåtgärderna inte Istället utlöses utlösarna och de infogade och borttagna tabellerna fylls därefter i enlighet därmed.
Om någon INSTEAD OF INSERT-utlösare definieras på måltabellen utförs inte insättningsoperationen. Istället fylls tabellen i enlighet med detta.
Behörigheter
Kräver SELECT-behörighet i källtabellen och INSERT, UPDATE eller DELETE-behörigheter i måltabellen. För mer information, se avsnittet Behörigheter i artiklarna SELECT, INSERT, UPDATE och DELETE.
Optimera MERGE Statement Performance
Genom att använda MERGE-satsen kan du ersätta den enskilda DML uttalanden med ett enda uttalande. Detta kan förbättra frågeprestanda eftersom operationerna utförs i ett enda uttalande, vilket minimerar antalet gånger som data i käll- och måltabellerna behandlas. Prestandavinster beror dock på att ha korrekta index, sammanfogningar och andra överväganden på plats.
Indexmetoder
För att förbättra prestanda för MERGE-uttalandet rekommenderar vi följande indexriktlinjer :
- Skapa ett index på kopplingskolumnerna i källtabellen som är unikt och täcker.
- Skapa ett unikt grupperat index på kopplingskolumnerna i måltabellen.
Dessa index säkerställer att kopplingsnycklarna är unika och att data i tabellerna sorteras. Frågan har förbättrats eftersom frågeoptimeraren inte behöver utföra extra valideringsbehandling för att lokalisera och uppdatera dubbla rader och ytterligare sorteringsåtgärder inte är nödvändiga.
Gå med i bästa metoder
För att förbättra prestanda för MERGE-uttalandet och se till att korrekta resultat uppnås, rekommenderar vi följande riktlinjer för anslutning:
- Ange endast sökvillkor i ON < merge_search_condition > klausul som bestämmer kriterierna för att matcha data i käll- och måltabellerna. Det vill säga bara ange kolumner från måltabellen som jämförs med motsvarande kolumner i källtabellen.
- Inkludera inte jämförelser med andra värden som en konstant.
Använd en av följande metoder för att filtrera bort rader från käll- eller måltabellerna.
- Ange sökvillkor för radfiltrering i lämplig WHEN-sats. Till exempel, NÄR INTE MATCHES OCH S.EmployeeName LIKE ”S%” INSÄTTAR DÄR …
- Definiera en vy på källan eller målet som returnerar de filtrerade raderna och refererar till vyn som källa eller mål tabell. Om vyn definieras i måltabellen måste alla åtgärder mot den uppfylla villkoren för att uppdatera vyer. Mer information om hur du uppdaterar data med hjälp av en vy finns i Ändra data genom en vy.
- Använd
WITH <common table expression>
-satsen för att filtrera bort rader från käll- eller måltabellerna . Den här metoden liknar att ange ytterligare sökkriterier i ON-klausulen och kan ge felaktiga resultat. Vi rekommenderar att du undviker att använda den här metoden eller testar noggrant innan du implementerar den.
Sammanfogningsoperationen i MERGE-uttalandet optimeras på samma sätt som en koppling till ett SELECT-uttalande. Det vill säga när SQL Server-processer går med väljer frågoptimiseraren den mest effektiva metoden (av flera möjligheter) för bearbetning av kopplingen. När källan och målet har samma storlek och de tidigare beskrivna indexriktlinjerna tillämpas på käll- och måltabellerna är en sammanslagningsoperatör den mest effektiva frågeplan. Detta beror på att båda tabellerna skannas en gång och det inte finns något behov av att sortera data. När källan är mindre än måltabellen föredras en kapslad loopoperator.
Du kan tvinga användningen av en specifik koppling genom att ange OPTION (<query_hint>)
-satsen i MERGE-uttalandet. Vi rekommenderar att du inte använder hash-kopplingen som en frågetips för MERGE-uttalanden eftersom den här kopplingstypen inte använder index.
Parameterisering Bästa metoder
Om en SELECT, INSERT, UPDATE , eller DELETE-satsen körs utan parametrar, kan SQL Server-frågan optimera välja att parametrisera satsen internt. Detta innebär att alla bokstavliga värden som finns i frågan ersätts med parametrar. Till exempel kan påståendet INSERT dbo.MyTable (Col1, Col2) VALUES (1, 10) implementeras internt som INSERT dbo.MyTable (Col1, Col2) VALUES (@ p1, @ p2). Denna process, som kallas enkel parameterisering, ökar förmågan hos relationsmotorn att matcha nya SQL-uttalanden med befintliga tidigare kompilerade exekveringsplaner. Frågeprestanda kan förbättras eftersom frekvensen av frågekompileringar och rekompileringar minskas. Frågaoptimeraren tillämpar inte den enkla parametreringsprocessen på MERGE-uttalanden. Därför kanske MERGE-satser som innehåller bokstavliga värden inte fungerar lika bra som enskilda INSERT-, UPDATE- eller DELETE-satser eftersom en ny plan sammanställs varje gång MERGE-satsen körs.
För att förbättra frågan, rekommenderar vi följande parametreringsriktlinjer:
- Parametrar alla bokstavliga värden i
ON <merge_search_condition>
-satsen och iWHEN
klausuler i MERGE-uttalandet. Du kan till exempel infoga MERGE-satsen i en lagrad procedur som ersätter bokstavsvärdena med lämpliga inmatningsparametrar. - Om du inte kan parametrisera uttalandet, skapa en planguide av typen
TEMPLATE
och angePARAMETERIZATION FORCED
frågetips i planguiden. - Om MERGE-uttalanden körs ofta i databasen, överväg att ställa in alternativet PARAMETERIZATION på databas till FORCED. Var försiktig när du ställer in detta alternativ. Alternativet
PARAMETERIZATION
är en databasnivåinställning och påverkar hur alla frågor mot databasen bearbetas.
Bästa praxis för TOP-klausulen
I MERGE-satsen specificerar TOP-klausulen antalet eller procentandelen rader som påverkas efter att källtabellen och måltabellen har sammanfogats, och efter att rader som inte uppfyller kraven för en insats, uppdatering eller borttagning tas bort . TOP-klausulen minskar ytterligare antalet sammanfogade rader till det angivna värdet och insättnings-, uppdaterings- eller raderingsåtgärderna tillämpas på de återstående sammanfogade raderna på ett oordnat sätt. Det vill säga det finns ingen ordning i vilken raderna fördelas mellan de åtgärder som definieras i WHEN-satserna. Till exempel påverkar 10 rader att specificera TOP (10); av dessa rader kan 7 uppdateras och 3 infogas, eller 1 kan raderas, 5 uppdateras och 4 infogas och så vidare.
Det är vanligt att använda TOP-klausulen för att utföra datamanipuleringsspråk (DML ) operationer på ett stort bord i satser. När du använder TOP-klausulen i MERGE-uttalandet för detta ändamål är det viktigt att förstå följande konsekvenser.
-
I / O-prestanda kan påverkas.
MERGE-uttalandet utför en fullständig tabellskanning av både käll- och måltabellerna. Genom att dela upp operationen i batchar minskas antalet skrivoperationer som utförs per batch. emellertid kommer varje batch att utföra en fullständig tabellskanning av käll- och måltabellerna. Den resulterande läsaktiviteten kan påverka sökfrågan.
-
Felaktiga resultat kan uppstå.
Det är viktigt att se till att alla på varandra följande satser inriktas på nya rader. eller oönskat beteende som att felaktigt infoga dubbletterader i måltabellen kan uppstå. Detta kan hända när källtabellen innehåller en rad som inte fanns i ett målparti men som fanns i den övergripande måltabellen.
-
För att säkerställa korrekta resultat:
- Använd PÅ-klausulen för att bestämma vilka källrader som påverkar befintliga målrader och vilka som verkligen är nya.
- Använd ett ytterligare villkor i avsnittet NÄR MATCHAD för att avgöra om målraden redan har uppdaterats av en tidigare sats.
Eftersom TOP-klausulen endast tillämpas efter att dessa klausuler tillämpas, infogar varje körning antingen en riktigt oöverträffad rad eller uppdaterar en befintlig rad.
Bulk Load Best Practices
MERGE-satsen kan användas för att effektivt samla in data från en källdatafil i en måltabell genom att ange OPENROWSET(BULK…)
-satsen som tabellkälla. Genom att göra detta bearbetas hela filen i en enda sats.
För att förbättra prestanda för massfusionsprocessen rekommenderar vi följande riktlinjer:
-
Skapa ett klustrat index på kopplingskolumnerna i måltabellen.
-
Använd ORDER- och UNIQUE-tipsen i
OPENROWSET(BULK…)
för att ange hur källdatafilen sorteras.Som standard förutsätter massoperationen att datafilen inte är ordnad. Därför är det viktigt att källdata sorteras enligt det klustrade indexet på måltabellen och att ORDER-tipset används för att ange ordningen så att frågoptimeringsprogrammet kan generera en mer effektiv frågeplan. Tips valideras vid körning; om dataströmmen inte överensstämmer med de angivna tipsen, uppstår ett fel.
Dessa riktlinjer säkerställer att kopplingsnycklarna är unika och att sorteringsordningen för data i källfilen matchar måltabellen. Frågan har förbättrats eftersom ytterligare sorteringsåtgärder inte är nödvändiga och onödiga datakopior inte krävs.
Mätning och diagnos av MERGE-prestanda
Följande funktioner är tillgängliga för att hjälpa dig att mäta och diagnostisera prestanda för MERGE-uttalanden.
- Använd den sammanslagna stmt-räknaren i sys.dm_exec_query_optimizer_info dynamisk hanteringsvy för att returnera antalet frågeoptimeringar som gäller för MERGE-uttalanden.
- Använd attributet merge_action_type i sys.dm_exec_plan_attributes dynamisk hanteringsvy för att returnera den typ av triggerkörningsplan som används som resultat av ett MERGE-uttalande.
- Använd SQL Trace för att samla felsökningsdata för MERGE-uttalandet på samma sätt skulle du göra för andra DML-uttalanden (Data Manipulation Language). Mer information finns i SQL Trace.
Exempel
A. Använda MERGE för att utföra INSERT- och UPDATE-operationer på en tabell i en enda sats
Ett vanligt scenario är att uppdatera en eller flera kolumner i en tabell om en matchande rad finns. Eller infoga data som en ny rad om en matchande rad inte finns. Du gör vanligtvis något av scenarierna genom att skicka parametrar till en lagrad procedur som innehåller lämpliga UPDATE- och INSERT-uttalanden. Med MERGE-satsen kan du utföra båda uppgifterna i ett enda uttalande. Följande exempel visar en lagrad procedur i AdventureWorks2012databasen som innehåller både ett INSERT-uttalande och ett UPDATE-uttalande. Proceduren ändras sedan för att köra motsvarande operationer med hjälp av en enda MERGE-sats.
B Använda MERGE för att utföra UPPDATERING och RADERA operationer på en tabell i ett enda uttalande
Följande exempel använder MERGE för att uppdatera ProductInventory
-tabellen i exempeldatabasen AdventureWorks2012, dagligen, baserat på order som behandlas i SalesOrderDetail
-tabellen. Kolumnen Quantity
i ProductInventory
-tabellen uppdateras genom att subtrahera antalet beställningar som görs varje dag för varje produkt i SalesOrderDetail
tabell. Om antalet beställningar för en produkt sänker lagernivån för en produkt till 0 eller mindre raderas den produkten från tabellen ProductInventory
.
C. Använda MERGE för att utföra UPDATE- och INSERT-operationer på en måltabell med hjälp av en härledd källtabell
Följande exempel använder MERGE för att modifiera tabellen SalesReason
i AdventureWorks2012-databasen genom att antingen uppdatera eller infoga rader. När värdet av NewName
i källtabellen matchar ett värde i Name
-kolumnen i måltabellen, (SalesReason
), kolumnen ReasonType
uppdateras i måltabellen. När värdet för NewName
inte stämmer, infogas källraden i måltabellen. Källtabellen är en härledd tabell som använder Transact-SQL-tabellvärdekonstruktören för att ange flera rader för källtabellen. För mer information om hur du använder tabellvärdekonstruktören i en härledd tabell, se Tabellvärdekonstruktör (Transact-SQL). Exemplet visar också hur man lagrar resultaten av OUTPUT-satsen i en tabellvariabel. Och, sedan sammanfattar du resultaten av MERGE-satsen genom att köra en enkel väljoperation som returnerar antalet infogade och uppdaterade rader.
D.Infoga resultaten av MERGE-satsen i en annan tabell
Följande exempel fångar data som returneras från OUTPUT-satsen i ett MERGE-sats och infogar data i en annan tabell. MERGE-uttalandet uppdaterar Quantity
-kolumnen i ProductInventory
-tabellen i AdventureWorks2012-databasen, baserat på beställningar som bearbetas i SalesOrderDetail
tabell. Exemplet fångar de uppdaterade raderna och infogar dem i en annan tabell som används för att spåra lagerförändringar.
E. Använd MERGE för att göra INSERT eller UPDATE den en målkanttabell i en grafdatabas
I det här exemplet skapar du nodtabeller Person
och City
och en kanttabell livesIn
. Du använder MERGE-uttalandet på kanten livesIn
och infogar en ny rad om kanten inte redan finns mellan en Person
och City
. Om kanten redan finns uppdaterar du bara StreetAddress-attributet på livesIn
-kanten.