- 20/08/2019
- 25 minutter at læse
-
- X
- c
- j
- r
- a
-
+18
Gælder for: SQL Server (alle understøttede versioner) Azure SQL Database Azure Synapse Analytics
Kører indsættelse, opdatering eller sletning af handlinger på en måltabel fra resultaterne af en sammenføjning med en kildetabel. Synkroniser f.eks. To tabeller ved at indsætte, opdatere eller slette rækker i en tabel baseret på forskelle, der findes i den anden tabel.
Bemærk
MERGE er i øjeblikket i preview for Azure Synapse Analytics.
Ydelsestip: Den betingede adfærd, der er beskrevet for MERGE-sætningen, fungerer bedst, når de to tabeller har en kompleks blanding af matchende egenskaber. For eksempel at indsætte en række, hvis den ikke findes, eller opdatere en række, hvis den stemmer overens. Når du blot opdaterer en tabel baseret på række i en anden tabel, skal du forbedre ydeevnen og skalerbarheden med grundlæggende INSERT-, UPDATE- og DELETE-sætninger. For eksempel:
Transact-SQL-syntakskonventioner
Syntaks
Bemærk
For at se Transact-SQL-syntaks til SQL Server 2014 og tidligere, se dokumentation til tidligere versioner.
Argumenter
MED < common_table_expression >
Angiver det midlertidige navngivne resultatsæt eller -visning, også kendt som fælles tabeludtryk, som er defineret inden for rammerne af MERGE-erklæringen. Resultatsættet stammer fra en simpel forespørgsel og henvises til i MERGE-sætningen. For yderligere oplysninger, se MED common_table_expression (Transact-SQL).
TOP (udtryk)
Specificerer antallet eller procentdelen af de berørte rækker. udtryk kan enten være et tal eller en procentdel af rækkerne. Rækkerne, der henvises til i TOP-udtrykket, er ikke arrangeret i nogen rækkefølge. For mere information, se TOP (Transact-SQL).
TOP-klausulen gælder efter hele kildetabellen og hele måltabellen slutter sig sammen og de sammenføjede rækker, der ikke kvalificerer sig til en indsættelse, opdatering eller slettehandling fjernes. TOP-klausulen reducerer yderligere antallet af sammenføjede rækker til den angivne værdi. Indsæt, opdater eller slet handlinger gælder for de resterende sammenføjede rækker på en uordnet måde. Det vil sige, der er ingen rækkefølge, hvor rækker er fordelt på de handlinger, der er defineret i WHEN-klausulerne. For eksempel påvirker angivelse af TOP (10) 10 rækker. Af disse rækker kan 7 opdateres og 3 indsættes, eller 1 kan slettes, 5 opdateres og 4 indsættes osv.
Fordi MERGE-sætningen udfører en fuldstændig tabel-scanning af både kilden og måltabeller, påvirkes I / O-ydeevne undertiden, når man bruger TOP-klausulen til at ændre en stor tabel ved at oprette flere batcher. I dette scenarie er det vigtigt at sikre, at alle på hinanden følgende batcher er målrettet mod nye rækker.
database_name
Navnet på den database, hvor target_table er placeret.
schema_name
Navnet på skemaet, som target_table hører til.
target_table
Tabellen eller visningen, som datarækkerne fra < table_source > matches til < clause_search_condition >. target_table er målet for enhver indsats, opdatering eller sletning specificeret af WHEN-klausulerne i MERGE-sætningen.
Hvis target_table er en visning, skal enhver handling mod den opfylde betingelserne for opdatering af visninger. For mere information, se Modify Data Through a View.
target_table kan ikke være en ekstern tabel. target_table kan ikke have nogen regler defineret.
table_alias
Et alternativt navn, der skal henvise til en tabel for target_table.
BRUGER < table_source >
Specificerer den datakilde, der matcher med datarækkerne i target_table baseret på < merge_search condition >. Resultatet af denne kamp dikterer de handlinger, der skal udføres af WHEN-klausulerne i MERGE-erklæringen. < table_source > kan være en ekstern tabel eller en afledt tabel, der får adgang til eksterne tabeller.
< table_source > kan være en afledt tabel, der bruger Transact-SQL-tabelværdikonstruktøren til at konstruere en tabel ved at angive flere rækker.
table_alias – Et alternativt navn til at henvise til en tabel til table_source.
For at få flere oplysninger om syntaksen og argumenterne for denne klausul, se FROM (Transact-SQL).
ON < merge_search_condition >
Angiver de betingelser, som < table_source > slutter sig til target_table for at bestemme, hvor de matcher.
Forsigtig
Det er vigtigt kun at specificere kolonnerne fra måltabellen, der skal bruges til matchende formål. Det vil sige, angiv kolonner fra måltabellen, der sammenlignes med den tilsvarende kolonne i kildetabellen. Forsøg ikke at forbedre forespørgselsydelsen ved at filtrere rækker i måltabellen ON-klausulen f.eks. som angivelse af AND NOT target_table.column_x = value
. Dette kan muligvis returnere uventede og forkerte resultater.
NÅR DEN MATCHEDE DENNE < merge_matched >
Angiver, at alle rækker af * target_table, der matcher rækkerne returneret af < table_source > ON < merge_search_condition >, og tilfredsstiller enhver yderligere søgebetingelse, opdateres eller slettes i henhold til < merge_matched > klausul.
MERGE-sætningen kan højst have to NÅR MATCHED-klausuler. Hvis der er angivet to klausuler, skal den første klausul ledsages af en AND < search_condition > klausul. For en given række anvendes den anden WHEN MATCHED-klausul kun, hvis den første ikke er “t. Hvis der er to WHEN MATCHED-klausuler, skal man angive en UPDATE-handling, og man skal angive en SLET-handling. Når UPDATE er specificeret i < merge_matched > klausul og mere end en række < tabel_kilde > matcher en række i target_table baseret på < merge_search_condition >, SQL Server returnerer en fejl. MERGE-sætningen kan” t opdater den samme række mere end én gang, eller opdater og slet den samme række.
NÅR IKKE MATCHES DER < merge_not_matched >
Angiver, at en række indsættes i måltabel for hver række, der returneres af < table_source > ON < merge_search_condition > der ikke matcher en række i targ et_table, men opfylder en yderligere søgebetingelse, hvis den findes. Værdierne, der skal indsættes, er specificeret af < merge_not_matched > -sætningen. MERGE-erklæringen kan kun have en NÅR IKKE MATCHED-klausul.
NÅR IKKE MATCHES PÅ KILDE DAN < merge_matched >
Angiver, at alle rækker af * target_table, som ikke matcher de rækker, der returneres af < table_source > ON < merge_search_condition >, og som opfylder enhver yderligere søgebetingelse, opdateres eller slettes i henhold til < merge_matched > klausul.
MERGE-sætningen kan højst have to NÅR IKKE MATCHES AF SOURCE-klausuler. Hvis der er angivet to klausuler, skal den første klausul ledsages af en AND < klausul_søgning_tilstand > klausul. For en given række anvendes den anden NÅR IKKE MATCHED BY SOURCE klausul, hvis den første ikke er ” t. Hvis der er to NÅR IKKE MATCHED BY SOURCE-klausuler, skal man angive en UPDATE-handling, og man skal angive en DELETE-handling. Kun kolonner fra måltabellen kan henvises til i < clause_search_condition >.
Når ingen rækker returneres af < table_source >, kolonner i kildetabellen kan ikke fås. Hvis opdateringen eller sletningen er angivet i < merge_matched > klausuler henviser til kolonner i kildetabellen, fejl 207 (ugyldigt kolonnenavn) returneres. Eksempel: klausulen WHEN NOT MATCHED BY SOURCE THEN UPDATE SET TargetTable.Col1 = SourceTable.Col1
kan medføre, at udsagnet mislykkes, fordi Col1
i kildetabellen er utilgængelig.
OG < clause_search_condition >
Angiver en hvilken som helst gyldig søgebetingelse. For mere information, se søgebetingelse (Transact-SQL).
< table_hint_limited >
Angiver et eller flere tabeltip, der skal anvendes på måltabellen for hver af disse e indsætte, opdatere eller slette handlinger udført af MERGE-erklæringen. Nøgleordet WITH og parenteserne er påkrævet.
NOLOCK og READUNCOMMITTED er ikke tilladt. For mere information om tabelhenvisninger, se Table Hints (Transact-SQL).
At specificere TABLOCK-antydningen på en tabel, der er målet for en INSERT-sætning, har den samme effekt som at angive TABLOCKX-tipet. En eksklusiv lås tages på bordet. Når FORCESEEK er specificeret, gælder det for den implicitte forekomst af måltabellen, der er forbundet med kildetabellen.
Forsigtig
Angivelse af READPAST med NÅR IKKE MATCHES SÅDAN INSERT kan resultere i INSERT-operationer, der overtræder UNIQUE begrænsninger.
INDEX (index_val)
Specificerer navnet eller IDet på et eller flere indekser i måltabellen for at foretage en implicit sammenkædning med kildetabellen. For mere information, se Tabel tip (Transact -SQL).
< output_clause >
Returnerer en række for hver række i måltabel, som “s opdateret, indsat eller slettet i ingen særlig rækkefølge. $ handling kan specificeres i outputklausulen. $ action er en kolonne af typen nvarchar (10), der returnerer en af tre værdier for hver række: “INSERT”, “UPDATE” eller “DELETE” i henhold til handlingen udført på den række. For mere information om argumenter og opførsel af denne klausul, se OUTPUT-klausul (Transact-SQL).
< merge_matched >
Specificerer den opdaterings- eller sletningshandling, der er anvendt på alle rækker af mål_tabel, der ikke matcher de rækker, der returneres af < tabel_kilde > ON < merge_search_condition >, og som opfylder enhver yderligere søgebetingelse.
UPDATE SET < set_clause >
Angiver listen over kolonne- eller variabelnavne, der skal opdateres i måltabellen, og de værdier, hvorpå de skal opdateres.
For yderligere oplysninger om argumenterne i denne klausul, se UPDATE (Transact-SQL). Indstilling af en variabel til den samme værdi som en kolonne understøttes ikke.
SLETT
Angiver, at de rækker, der matcher rækker i target_table, slettes.
< merge_not_matched >
Angiver de værdier, der skal indsættes i måltabellen.
(column_list)
En liste over en eller flere kolonner i måltabellen, som data skal indsættes i. Kolonner skal angives som et enkelt navn, ellers mislykkes MERGE-sætningen. kolonne_liste skal være indeholdt i parentes og afgrænset med komma.
VÆRDIER ( values_list) – En kommasepareret liste over konstanter, variabler eller udtryk, der returnerer værdier, der skal indsættes i måltabellen. Udtryk kan ikke indeholde en EXECUTE-sætning.
STANDARDVÆRDIER
Tvinger indsat række for at indeholde standardværdierne defineret for hver kolonne.
For mere information om denne klausul, se INSERT (Transact-SQL).
< search_condition >
Speci svarer til søgebetingelserne for at angive < merge_search_condition > eller < clause_search_condition >. For mere information om argumenterne for denne klausul, se Søgebetingelse (Transact-SQL).
< graf-søgemønster >
Specificerer grafmatchmønsteret. For mere information om argumenterne for denne klausul, se MATCH (Transact-SQL)
Bemærkninger
Bemærk
I Azure Synapse Analytics, MERGE kommando (forhåndsvisning) har følgende forskelle i forhold til SQL-server og Azure SQL-database.
- En MERGE-opdatering implementeres som et slette- og indsætpar. Det berørte rækkeantal for en MERGE-opdatering inkluderer de slettede og indsatte rækker.
- Under forhåndsvisning understøttes tabeller med identitetskolonne ikke af kommandoen Synapse SQL MERGE.
- Understøttelsen af tabeller med forskellige distributionstyper er beskrevet i denne tabel:
FUSION CLAUSE i Azure Synapse Analytics Understøttet TARGE-distributionstabel Understøttet SOURCE-distributionstabel Kommentar NÅR MATCHED Alle distributionstyper Alle distributionstyper IKKE MATCHED TIL MÅL HASH Alle distributionstyper Brug UPDATE / SLET FRA … JOIN for at synkronisere to tabeller. IKKE MATCHED VED KILDE Alle distributionstyper Alle distributionstyper
Mindst en af de tre MATCHED-klausuler skal specificeres, men de kan specificeres i enhver rækkefølge. En variabel kan ikke opdateres mere end én gang i den samme MATCHED-klausul.
Enhver indsættelse, opdatering eller sletning, der er specificeret i måltabellen af MERGE-sætningen, er begrænset af eventuelle begrænsninger, der er defineret på den, inklusive eventuelle kaskaderende referencepræsentative begrænsninger. Hvis IGNORE_DUP_KEY er TIL for eventuelle unikke indekser på måltabellen, ignorerer MERGE denne indstilling.
MERGE-sætningen kræver et semikolon (;) som en sætningsterminator. Fejl 10713 hæves, når en MERGE-sætning køres uden terminatoren.
Når den bruges efter MERGE, returnerer @@ ROWCOUNT (Transact-SQL) det samlede antal rækker indsat, opdateret og slettet til klienten.
MERGE er et fuldt reserveret nøgleord, når databasens kompatibilitetsniveau er indstillet til 100 eller højere. MERGE-erklæringen er tilgængelig under både 90 og 100 databasekompatibilitetsniveauer; nøgleordet er dog ikke fuldt forbeholdt, når databasekompatibilitetsniveauet er indstillet til 90.
Brug ikke MERGE-sætningen, når du bruger opdateringsreplikering i kø. MERGE og opdateringsudløseren i kø er ikke kompatible. Udskift MERGE-sætningen med en indsættelse eller en opdateringserklæring.
Triggerimplementering
For hver indsats, opdatering eller sletning, der er specificeret i MERGE-sætningen, SQL Server affyrer alle tilsvarende AFTER-udløsere, der er defineret i måltabellen, men garanterer ikke, hvilken handling der skal udløses, udløser først eller sidst. Triggers defineret for den samme handling respekterer den rækkefølge, du angiver. For at få flere oplysninger om indstilling af triggerfyringsrækkefølge, se Angiv første og sidste udløsere.
Hvis måltabellen har en aktiveret INSTEAD OF-trigger defineret til en indsats-, opdaterings- eller sletningshandling udført af en MERGE-sætning , det skal have en aktiveret INSTEAD OF-trigger for alle de handlinger, der er specificeret i MERGE-sætningen.
Hvis nogen INSTEAD OF UPDATE eller INSTEAD OF DELETE-udløsere er defineret på target_table, er opdaterings- eller sletningshandlingerne ikke Kør. I stedet udløser udløseren og de indsatte og slettede tabeller derefter i overensstemmelse hermed.
Hvis nogen INSTEAD OF INSERT triggers er defineret på target_table, udføres indsættelsen ikke. I stedet udfyldes tabellen i overensstemmelse hermed.
Tilladelser
Kræver SELECT-tilladelse på kildetabellen og INSERT, UPDATE eller DELETE-tilladelser på måltabellen. For mere information, se afsnittet Tilladelser i artiklerne SELECT, INSERT, UPDATE og SLET.
Optimering af MERGE Statement Performance
Ved at bruge MERGE-sætningen kan du erstatte den enkelte DML udsagn med en enkelt erklæring. Dette kan forbedre forespørgselsydeevnen, fordi operationerne udføres inden for en enkelt sætning, hvilket minimerer antallet af gange, data i kilden og måltabellerne behandles. Prestationsgevinster afhænger dog af at have korrekte indekser, sammenføjninger og andre overvejelser på plads.
Indeks Bedste fremgangsmåder
For at forbedre effektiviteten af MERGE-sætningen anbefaler vi følgende indeksretningslinjer :
- Opret et indeks på tilslutningskolonnerne i kildetabellen, der er unikt og dækker.
- Opret et unikt grupperet indeks på sammenføjningskolonnerne i måltabellen.
Disse indekser sikrer, at sammenkædningsnøglerne er unikke, og dataene i tabellerne sorteres. Forespørgselens ydeevne forbedres, fordi forespørgselsoptimeringsværktøjet ikke behøver at udføre ekstra valideringsbehandling for at lokalisere og opdatere duplikerede rækker, og yderligere sorteringshandlinger ikke er nødvendige.
Deltag i bedste praksis
For at forbedre udførelse af MERGE-erklæringen og sikre, at der opnås korrekte resultater, anbefaler vi følgende retningslinjer for deltagelse:
- Angiv kun søgeforhold i ON < merge_search_condition > klausul, der bestemmer kriterierne for matchende data i kilde- og måltabellerne. Det vil sige, angiv kun kolonner fra måltabellen, der sammenlignes med de tilsvarende kolonner i kildetabellen.
- Inkluder ikke sammenligninger med andre værdier såsom en konstant.
Brug en af følgende metoder til at filtrere rækker fra kilde- eller måltabellerne.
- Angiv søgebetingelsen for rækkefiltrering i den relevante WHEN-klausul. For eksempel, NÅR IKKE MATCHES OG S.EmployeeName LIKE “S%” DAN INDSÆTTER ….
- Definer en visning på kilden eller målet, der returnerer de filtrerede rækker og henviser til visningen som kilden eller målet bord. Hvis visningen er defineret i måltabellen, skal enhver handling mod den opfylde betingelserne for opdatering af visninger. Se Ændring af data gennem en visning for at få flere oplysninger om opdatering af data ved hjælp af en visning.
- Brug
WITH <common table expression>
-klausulen til at filtrere rækker fra kilde- eller måltabellerne . Denne metode svarer til at specificere yderligere søgekriterier i ON-klausulen og kan give forkerte resultater. Vi anbefaler, at du undgår at bruge denne metode eller tester grundigt, før du implementerer den.
Tilslutningsoperationen i MERGE-sætningen optimeres på samme måde som en sammenkædning i en SELECT-sætning. Når SQL Server-processer tilslutter sig, vælger forespørgselsoptimeringsværktøjet den mest effektive metode (ud af flere muligheder) til behandling af sammenføjningen. Når kilden og målet har samme størrelse, og de tidligere beskrevne indeksretningslinjer anvendes på kilde- og måltabellerne, er en fusionssammenslutningsoperatør den mest effektive forespørgselsplan. Dette skyldes, at begge tabeller scannes en gang, og at der ikke er behov for at sortere dataene. Når kilden er mindre end måltabellen, foretrækkes en indlejret sløjfeoperatør.
Du kan tvinge brugen af en bestemt sammenføjning ved at angive OPTION (<query_hint>)
-sætningen i MERGE-erklæringen. Vi anbefaler, at du ikke bruger hash-sammenkædning som et forespørgselstip til MERGE-udsagn, fordi denne sammenkædningstype ikke bruger indekser.
Parameterisering Bedste fremgangsmåder
Hvis en VÆLG, INDSÆT, OPDATERING , eller DELETE-sætning udføres uden parametre, kan SQL Server-forespørgselsoptimeringsprogrammet vælge at parametrere sætningen internt. Dette betyder, at eventuelle bogstavelige værdier, der er indeholdt i forespørgslen, erstattes af parametre. Eksempelvis kan udsagnet INSERT dbo.MyTable (Col1, Col2) VALUES (1, 10) implementeres internt som INSERT dbo.MyTable (Col1, Col2) VALUES (@ p1, @ p2). Denne proces, kaldet simpel parameterisering, øger den relationelle motores evne til at matche nye SQL-sætninger med eksisterende, tidligere kompilerede eksekveringsplaner. Forespørgselsydeevne kan forbedres, fordi hyppigheden af forespørgsels kompileringer og rekompileringer reduceres. Forespørgselsoptimeringsværktøjet anvender ikke den enkle parametreringsproces til MERGE-sætninger. Derfor kan MERGE-sætninger, der indeholder bogstavelige værdier, muligvis ikke udføre så godt som individuelle INSERT-, UPDATE- eller DELETE-sætninger, fordi en ny plan udarbejdes, hver gang MERGE-sætningen udføres.
For at forbedre forespørgselsydelsen anbefaler vi følgende parametreringsretningslinjer:
- Parameteriser alle bogstavelige værdier i
ON <merge_search_condition>
-sætningen og iWHEN
klausuler i MERGE-erklæringen. For eksempel kan du inkorporere MERGE-sætningen i en lagret procedure, der erstatter de bogstavelige værdier med passende inputparametre. - Hvis du ikke kan parametrere sætningen, skal du oprette en planguide af typen
TEMPLATE
og angivPARAMETERIZATION FORCED
forespørgselstip i planvejledningen. - Hvis MERGE-sætninger udføres ofte i databasen, skal du overveje at indstille indstillingen PARAMETERIZATION på database til FORCE. Vær forsigtig, når du indstiller denne mulighed. Indstillingen
PARAMETERIZATION
er en indstilling på databaseniveau og påvirker, hvordan alle forespørgsler mod databasen behandles.
TOP-klausul bedste fremgangsmåder
I MERGE-sætningen specificerer TOP-klausulen antallet eller procentdelen af rækker, der er berørt efter kildetabellen og måltabellen er sammenføjet, og efter at rækker, der ikke kvalificerer sig til en indsættelse, opdatering eller sletning, fjernes . TOP-klausulen reducerer yderligere antallet af sammenføjede rækker til den angivne værdi, og indsæt, opdater eller slet-handlinger anvendes på de resterende sammenføjede rækker på en ikke-ordnet måde. Det vil sige, der er ingen rækkefølge, hvor rækkerne fordeles mellem de handlinger, der er defineret i WHEN-klausulerne. For eksempel påvirker angivelse af TOP (10) 10 rækker; af disse rækker kan 7 opdateres og 3 indsættes, eller 1 kan slettes, 5 opdateres og 4 indsættes og så videre.
Det er almindeligt at bruge TOP-klausulen til at udføre data manipulation sprog (DML ) operationer på et stort bord i batches. Når du bruger TOP-klausulen i MERGE-erklæringen til dette formål, er det vigtigt at forstå følgende konsekvenser.
-
I / O-ydeevne kan blive påvirket.
MERGE-erklæringen udfører en komplet tabel-scanning af både kilde- og måltabellerne. Ved at opdele operationen i batches reduceres antallet af udførte skriveoperationer pr. Batch; hvert batch udfører dog en fuld tabellscanning af kilde- og måltabellerne. Den resulterende læseaktivitet kan påvirke forespørgslens ydeevne.
-
Forkerte resultater kan forekomme.
Det er vigtigt at sikre, at alle på hinanden følgende batcher er målrettet mod nye rækker. eller uønsket adfærd, såsom forkert indsættelse af duplikatrækker i måltabellen, kan forekomme. Dette kan ske, når kildetabellen inkluderer en række, der ikke var i et målbatch, men som var i den overordnede måltabel.
-
For at sikre korrekte resultater:
- Brug ON-klausulen til at bestemme, hvilke kilderækker der påvirker eksisterende målrækker, og hvilke der er virkelig nye.
- Brug en yderligere betingelse i klausulen WHEN MATCHED for at afgøre, om målrækken allerede er opdateret af et tidligere parti.
Da TOP-klausulen kun anvendes, når disse klausuler er anvendt, indsætter hver udførelse enten en virkelig uovertruffen række eller opdaterer en eksisterende række.
Bulk Load Best Practices
MERGE-sætningen kan bruges til effektiv masseindlæsning af data fra en kildedatafil til en måltabel ved at angive OPENROWSET(BULK…)
-klausulen som tabelkilde. Ved at gøre dette behandles hele filen i en enkelt batch.
For at forbedre effektiviteten af bulkfusionsprocessen anbefaler vi følgende retningslinjer:
-
Opret et klynget indeks på sammenføjningskolonnerne i måltabellen.
-
Brug ORDER- og UNIQUE-tipene i
OPENROWSET(BULK…)
-klausulen til at specificere hvordan kildedatafilen sorteres.Som standard antager bulkoperationen, at datafilen ikke er ordnet. Derfor er det vigtigt, at kildedataene sorteres i henhold til det klyngede indeks på måltabellen, og at ORDER-tipet bruges til at indikere rækkefølgen, så forespørgselsoptimeringsværktøjet kan generere en mere effektiv forespørgselsplan. Tip valideres ved kørselstid; hvis datastrømmen ikke er i overensstemmelse med de angivne tip, hæves der en fejl.
Disse retningslinjer sikrer, at sammenkædningstasterne er unikke, og at sorteringen af dataene i kildefilen matcher måltabellen. Forespørgselsydelse forbedres, fordi yderligere sorteringshandlinger ikke er nødvendige, og unødvendige datakopier ikke er påkrævet.
Måling og diagnosticering af MERGE-ydeevne
Følgende funktioner er tilgængelige for at hjælpe dig med at måle og diagnosticere udførelsen af MERGE-sætninger.
- Brug flet stmt-tælleren i sys.dm_exec_query_optimizer_info dynamisk ledelsesvisning til at returnere antallet af forespørgselsoptimeringer, der gælder for MERGE-sætninger.
- Brug attributten merge_action_type i sys.dm_exec_plan_attributes dynamisk ledelsesvisning for at returnere typen af udførelsesplan, der blev brugt som resultat af en MERGE-sætning.
- Brug SQL Trace til at indsamle fejlfindingsdata til MERGE-sætningen på samme måde du ville for andre udsagn om databehandling (DML). For mere information, se SQL Trace.
Eksempler
A. Brug af MERGE til at udføre INSERT- og UPDATE-operationer på en tabel i en enkelt sætning
Et almindeligt scenario er at opdatere en eller flere kolonner i en tabel, hvis der findes en matchende række. Eller indsætte data som en ny række, hvis der ikke findes en matchende række. Du gør normalt begge scenarier ved at videregive parametre til en gemt procedure, der indeholder de relevante UPDATE- og INSERT-sætninger. Med MERGE-sætningen kan du udføre begge opgaver i en enkelt sætning. Følgende eksempel viser en gemt procedure i AdventureWorks2012databasen, der indeholder både en INSERT-sætning og en UPDATE-sætning. Proceduren ændres derefter til at køre de tilsvarende operationer ved hjælp af en enkelt MERGE-sætning.
B Brug af MERGE til at udføre OPDATERE og SLET operationer på en tabel i en enkelt sætning
Følgende eksempel bruger MERGE til at opdatere ProductInventory
-tabellen i AdventureWorks2012-eksempeldatabasen, dagligt, baseret på ordrer, der behandles i SalesOrderDetail
-tabellen. Quantity
-kolonnen i ProductInventory
-tabellen opdateres ved at trække antallet af ordrer, der afgives hver dag for hvert produkt i SalesOrderDetail
tabel. Hvis antallet af ordrer for et produkt falder lagerets niveau for et produkt til 0 eller mindre, slettes rækken for det produkt fra tabellen ProductInventory
.
C. Brug af MERGE til at udføre UPDATE- og INSERT-operationer på en måltabel ved hjælp af en afledt kildetabel
Følgende eksempel bruger MERGE til at ændre SalesReason
-tabellen i AdventureWorks2012-databasen ved enten at opdatere eller indsætte rækker. Når værdien af NewName
i kildetabellen matcher en værdi i Name
-kolonnen i måltabellen, (SalesReason
), ReasonType
kolonnen opdateres i måltabellen. Når værdien af NewName
ikke stemmer overens, indsættes kildelinjen i måltabellen. Kildetabellen er en afledt tabel, der bruger Transact-SQL-tabelværdikonstruktøren til at angive flere rækker til kildetabellen. For mere information om brug af tabelværdikonstruktøren i en afledt tabel, se Tabelværdikonstruktør (Transact-SQL). Eksemplet viser også, hvordan man gemmer resultaterne af OUTPUT-klausulen i en tabelvariabel. Og, derefter opsummerer du resultaterne af MERGE-sætningen ved at køre en simpel markeringsoperation, der returnerer antallet af indsatte og opdaterede rækker.
D.Indsættelse af resultaterne af MERGE-sætningen i en anden tabel
Følgende eksempel registrerer data returneret fra OUTPUT-klausulen i en MERGE-sætning og indsætter disse data i en anden tabel. MERGE-sætningen opdaterer Quantity
-kolonnen i ProductInventory
-tabellen i AdventureWorks2012-databasen baseret på ordrer, der behandles i SalesOrderDetail
tabel. Eksemplet fanger de opdaterede rækker og indsætter dem i en anden tabel, der bruges til at spore lagerændringer.
E. Brug MERGE til at gøre INSERT eller UPDATE den en målkanttabel i en grafdatabase
I dette eksempel opretter du nodetabeller Person
og City
og en kanttabel livesIn
. Du bruger MERGE-sætningen på kanten livesIn
og indsætter en ny række, hvis kanten ikke allerede findes mellem en Person
og City
. Hvis kanten allerede findes, opdaterer du bare StreetAddress-attributten på livesIn
kanten.