MERGE (Transact-SQL) (Norsk)

  • 20.08.2019
  • 25 minutter å lese
    • X
    • c
    • j
    • r
    • a
    • +18

Gjelder: SQL Server (alle støttede versjoner) Azure SQL Database Azure Synapse Analytics

Kjører innsetting, oppdatering eller sletting av operasjoner på en måltabell fra resultatene av en bli med en kildetabell. Synkroniser for eksempel to tabeller ved å sette inn, oppdatere eller slette rader i en tabell basert på forskjeller som er funnet i den andre tabellen.

Merk

MERGE er for øyeblikket i forhåndsvisning for Azure Synapse Analytics.

Ytelsestips: Betinget oppførsel beskrevet for MERGE-setningen fungerer best når de to tabellene har en kompleks blanding av samsvarende egenskaper. For eksempel å sette inn en rad hvis den ikke eksisterer, eller oppdatere en rad hvis den stemmer overens. Når du bare oppdaterer en tabell basert på radene i en annen tabell, forbedrer du ytelsen og skalerbarheten med grunnleggende INSERT-, UPDATE- og DELETE-setninger. eksempel:

Transact-SQL syntakskonvensjoner

Syntaks

Merk

Hvis du vil se Transact-SQL-syntaks for SQL Server 2014 og tidligere, se dokumentasjon for tidligere versjoner.

Argumenter

MED < common_table_expression >
Spesifiserer det midlertidige navngitte resultatsettet eller visningen, også kjent som vanlig tabelluttrykk, som er definert innenfor rammen av MERGE uttalelsen. Resultatsettet kommer fra et enkelt spørsmål og refereres til av MERGE-setningen. For mer informasjon, se MED vanlig_tabelluttrykk (Transact-SQL).

TOPP (uttrykk)
Spesifiserer antall eller prosentandel av berørte rader. uttrykk kan være enten et tall eller en prosentandel av radene. Radene det refereres til i TOP-uttrykket er ikke ordnet i noen rekkefølge. For mer informasjon, se TOP (Transact-SQL).

TOP-klausulen gjelder etter at hele kildetabellen og hele måltabellen blir med og de sammenkoblede radene som ikke kvalifiserer for innsetting, oppdatering eller slettehandling fjernes. TOP-klausulen reduserer antall sammenføyde rader ytterligere til den angitte verdien. Sett inn, oppdater eller slett handlingene gjelder for de resterende sammenføyde radene på en uordnet måte. Det vil si at det ikke er noen rekkefølge i hvilken rader er fordelt på handlingene som er definert i NÅR-leddene. For eksempel påvirker 10 rader å spesifisere TOPP (10). Av disse radene kan 7 oppdateres og 3 settes inn, eller 1 kan slettes, 5 oppdateres og 4 settes inn, og så videre.

Fordi MERGE-setningen utfører en fullstendig tabellskanning av både kilden og måltabeller, påvirkes I / O-ytelsen noen ganger når du bruker TOP-setningen til å endre en stor tabell ved å opprette flere batcher. I dette scenariet er det viktig å sikre at alle påfølgende grupper retter seg mot nye rader.

database_name
Navnet på databasen der target_table er plassert.

schema_name
Navnet på skjemaet som måltabell tilhører.

mål_tabel
Tabellen eller visningen som dataene rader fra < tabellkilde > samsvares basert på < clause_search_condition >. target_table er målet for alle innsettings-, oppdaterings- eller slettingsoperasjoner spesifisert av WHEN-leddene i MERGE-setningen.

Hvis target_table er en visning, må alle handlinger mot den tilfredsstille vilkårene for oppdatering av visninger. For mer informasjon, se Endre data gjennom en visning.

target_table kan ikke være en ekstern tabell. target_table kan ikke ha noen regler definert på det.

table_alias
Et alternativt navn for å referere til en tabell for target_table.

BRUKER < table_source >
Spesifiserer datakilden som samsvarer med dataradene i target_table basert på < merge_search condition >. Resultatet av denne kampen dikterer handlingene som skal utføres av NÅR-leddene i MERGE-uttalelsen. < table_source > kan være en ekstern tabell eller en avledet tabell som får tilgang til eksterne tabeller.

< table_source > kan være en avledet tabell som bruker Transact-SQL tabellverdikonstruktøren til å konstruere en tabell ved å spesifisere flere rader.

table_alias – Et alternativt navn for å referere til en tabell for table_source.

For mer informasjon om syntaksen og argumentene til denne paragrafen, se FROM (Transact-SQL).

PÅ < merge_search_condition >
Spesifiserer forholdene der < table_source > slutter seg til måltabellen for å bestemme hvor de samsvarer.

Forsiktig

Det er viktig å bare spesifisere kolonnene fra måltabellen som skal brukes til samsvarende formål. Det vil si spesifisere kolonner fra måltabellen som sammenlignes med den tilsvarende kolonnen i kildetabellen. Ikke forsøk å forbedre spørringsytelsen ved å filtrere ut rader i måltabellen i ON-klausulen; for eksempel for eksempel å spesifisere AND NOT target_table.column_x = value. Hvis du gjør det, kan det føre til uventede og uriktige resultater.

NÅR DET KAMPES < merge_matched >
Spesifiserer at alle rader med * target_table, som samsvarer med radene som returneres av < table_source > ON < merge_search_condition >, og tilfredsstiller eventuelle ekstra søkebetingelser, blir enten oppdatert eller slettet i henhold til < merge_matched > klausul.

MERGE-setningen kan maksimalt ha to NÅR MATCHED klausuler. Hvis to klausuler er spesifisert, må den første klausulen ledsages av en AND < search_condition > klausul. For en gitt rad blir den andre WHEN MATCHED-klausulen bare brukt hvis den første ikke er «t. Hvis det er to WHEN MATCHED-klausuler, må man spesifisere en OPPDATERING og en må spesifisere en SLETT-handling. Når OPPDATERING er spesifisert i < merge_matched > ledd, og mer enn en rad med < tabellkilde > samsvarer med en rad i target_table basert på < merge_search_condition >, SQL Server returnerer en feil. MERGE-setningen kan» t oppdater den samme raden mer enn én gang, eller oppdater og slett den samme raden.

NÅR IKKE MATCHES DAN < merge_not_matched >
Spesifiserer at en rad settes inn i måltabellen for hver rad som returneres av < table_source > PÅ < merge_search_condition > som ikke samsvarer med en rad i mål et_table, men tilfredsstiller en ekstra søkebetingelse, hvis den er tilstede. Verdiene som skal settes inn er spesifisert av < merge_not_matched > ledd. MERGE-setningen kan bare ha én NÅR IKKE MATCHED-klausul.

NÅR IKKE MATCHES PÅ KILDE SÅ < merge_matched >
Angir at alle rader med * target_table, som ikke samsvarer med radene som returneres av < table_source > PÅ < merge_search_condition >, og som tilfredsstiller eventuelle ekstra søkebetingelser, oppdateres eller slettes i henhold til < merge_matchet > klausul.

MERGE-setningen kan maksimalt ha to NÅR IKKE MATCHES PÅ KILDE-klausuler. Hvis to klausuler er spesifisert, må den første klausulen ledsages av en AND < klausul_søk_tilstand > klausul. For en gitt rad blir den andre NÅR IKKE MATCHED BY SOURCE-klausulen brukes bare hvis den første ikke er » t. Hvis det er to NÅR IKKE MATCHED BY SOURCE-klausuler, må man spesifisere en OPPDATERING og en må spesifisere en SLETT-handling. Bare kolonner fra måltabellen kan refereres til i < clause_search_condition >.

Når ingen rader returneres av < table_source >, kan ikke kolonner i kildetabellen nås. Hvis oppdateringen eller slettingen som er angitt i < merge_matched > ledd referanser kolonner i kildetabellen, feil 207 (ugyldig kolonnenavn) returneres. For eksempel er setningen WHEN NOT MATCHED BY SOURCE THEN UPDATE SET TargetTable.Col1 = SourceTable.Col1 kan føre til at utsagnet mislykkes fordi Col1 i kildetabellen er utilgjengelig.

OG < clause_search_condition >
Spesifiserer hvilken som helst gyldig søketilstand. For mer informasjon, se Søkebetingelser (Transact-SQL).

< table_hint_limited >
Spesifiserer ett eller flere tabelltips som skal brukes på måltabellen for hver av disse e sette inn, oppdatere eller slette handlinger utført av MERGE-setningen. MED-nøkkelordet og parentesene er påkrevd.

NOLOCK og READUNCOMMITTED er ikke tillatt. For mer informasjon om tabeltips, se Table Hints (Transact-SQL).

Spesifisering av TABLOCK-hintet på en tabell som er målet for en INSERT-setning har samme effekt som å spesifisere TABLOCKX-hintet. En eksklusiv lås tas på bordet. Når FORCESEEK er spesifisert, gjelder det den implisitte forekomsten av måltabellen som er koblet til kildetabellen.

Forsiktig

Å spesifisere READPAST med NÅR IKKE MATCHES DAN INSERT, kan resultere i INSERT-operasjoner som bryter med UNIKE begrensninger.

INDEKS (index_val)
Spesifiserer navnet eller ID-en til en eller flere indekser på måltabellen for å gjøre en implisitt tilknytning til kildetabellen. For mer informasjon, se Tabellhint (Transact -SQL).

< output_clause >
Returnerer en rad for hver rad i måltabellen som «s oppdatert, satt inn eller slettet, i ingen bestemt rekkefølge. $ action kan spesifiseres i utgangsparagrafen. $ action er en kolonne av typen nvarchar (10) som returnerer en av tre verdier for hver rad: «INSERT», «UPDATE» eller «DELETE», i henhold til handlingen utført på den raden. For mer informasjon om argumentene og oppførselen til denne paragrafen, se OUTPUT-klausul (Transact-SQL).

< merge_matched >
Spesifiserer oppdateringen eller slettingen som er brukt på alle rader med måltabell som ikke samsvarer med radene som returneres av < table_source > PÅ < merge_search_condition >, og som tilfredsstiller eventuelle tilleggssøkbetingelser.

UPDATE SET < set_clause >
Angir listen over kolonne- eller variabelnavn som skal oppdateres i måltabellen og verdiene du vil oppdatere dem med.

For mer informasjon om argumentene til denne paragrafen, se UPDATE (Transact-SQL). Å sette en variabel til samme verdi som en kolonne støttes ikke.

SLETT
Spesifiserer at radene som samsvarer med radene i måltabellen blir slettet.

< merge_not_matched >
Spesifiserer verdiene som skal settes inn i måltabellen.

(kolonneliste)
En liste over en eller flere kolonner i måltabellen der data skal settes inn. Kolonner må spesifiseres som et enkeltdelsnavn, ellers mislykkes MERGE-setningen. kolonneliste må være omgitt av parentes og avgrenset med komma.

VERDIER ( verdier_liste)
En kommaseparert liste over konstanter, variabler eller uttrykk som returnerer verdier som skal settes inn i måltabellen. Uttrykk kan ikke inneholde en UTFØRING-setning.

STANDARDVERDIER
Tvinger satt inn rad for å inneholde standardverdiene som er definert for hver kolonne.

For mer informasjon om denne paragrafen, se INSERT (Transact-SQL).

< search_condition >
Speci samsvarer med søkebetingelsene for å spesifisere < merge_search_condition > eller < clause_search_condition >. For mer informasjon om argumentene for denne paragrafen, se Søketilstand (Transact-SQL).

< graf-søkemønster >
Spesifiserer grafmatchmønsteret. For mer informasjon om argumentene for denne paragrafen, se MATCH (Transact-SQL)

Merknader

Merk

I Azure Synapse Analytics, MERGE kommando (forhåndsvisning) har følgende forskjeller sammenlignet med SQL-server og Azure SQL-database.

  • En MERGE-oppdatering er implementert som et par for å slette og sette inn. Det berørte radtallet for en MERGE-oppdatering inkluderer de slettede og innsatte radene.
  • Under forhåndsvisningen støttes ikke tabeller med identitetskolonne av Synapse SQL MERGE-kommandoen.
  • Støtten for tabeller med forskjellige distribusjonstyper er beskrevet i denne tabellen:

MERGE CLAUSE in Azure Synapse Analytics Støttet TARGE distribusjonstabell Støttet SOURCE distribusjonstabell Kommentar
NÅR MATCHED Alle distribusjonstyper Alle distribusjonstyper
IKKE PARTET MED MÅL HASH Alle distribusjonstyper Bruk UPDATE / DELETE FRA … JOIN for å synkronisere to tabeller.
IKKE MATCHED BY SOURCE Alle distribusjonstyper Alle distribusjonstyper

Minst en av de tre MATCHED-leddene må spesifiseres, men de kan spesifiseres i hvilken som helst rekkefølge. En variabel kan ikke oppdateres mer enn én gang i samme MATCHED-ledd.

Enhver innsetting, oppdatering eller sletting som er spesifisert i måltabellen av MERGE-setningen, er begrenset av eventuelle begrensninger som er definert på den, inkludert eventuelle kaskaderende referansegrenser. Hvis IGNORE_DUP_KEY er PÅ for unike indekser på måltabellen, ignorerer MERGE denne innstillingen.

MERGE-setningen krever et semikolon (;) som en termineringstest. Feil 10713 heves når en MERGE-setning kjøres uten terminatoren.

Når den brukes etter MERGE, returnerer @@ ROWCOUNT (Transact-SQL) totalt antall rader som er satt inn, oppdatert og slettet til klienten.

MERGE er et fullstendig reservert nøkkelord når databasekompatibilitetsnivået er satt til 100 eller høyere. MERGE-setningen er tilgjengelig under både 90 og 100 databankompatibilitetsnivåer; imidlertid er nøkkelordet ikke fullstendig reservert når databasekompatibilitetsnivået er satt til 90.

Ikke bruk MERGE-setningen når du bruker repeterende replikering i kø. MERGE og oppdateringsutløseren i kø er ikke kompatible. Erstatt MERGE-setningen med et innlegg eller en oppdateringsuttalelse.

Utløserimplementering

For hver innsetting, oppdatering eller sletting som er spesifisert i MERGE-setningen, SQL Server utløser eventuelle tilsvarende ETTER-utløsere som er definert i måltabellen, men garanterer ikke hvilken handling som skal utløses, utløser først eller sist. Utløsere definert for samme handling respekterer rekkefølgen du spesifiserer. For mer informasjon om innstilling av utløsningsrekkefølge, se Angi første og siste utløsere.

Hvis måltabellen har en aktivert INSTEAD OF utløser definert for en innsats, oppdatering eller sletting av handlinger utført av en MERGE-setning. må den ha en aktivert INSTEAD OF-utløser for alle handlingene som er spesifisert i MERGE-setningen.

Hvis noen INSTEAD OF UPDATE eller INSTEAD OF SLETT-utløsere er definert på target_table, er oppdaterings- eller slettingsoperasjonene ikke I stedet utløser utløseren og de innsatte og slettede tabellene deretter.

Hvis noen INSTEAD OF INSERT triggers er definert på target_table, blir ikke innsettingsoperasjonen utført. I stedet fylles tabellen ut tilsvarende.

Tillatelser

Krever SELECT-tillatelse på kildetabellen og INSERT, UPDATE eller SLETT tillatelser på måltabellen. For mer informasjon, se Tillatelser-delen i SELECT, INSERT, UPDATE, og SLETT-artiklene.

Optimalisering av MERGE Statement Performance

Ved å bruke MERGE-setningen kan du erstatte den enkelte DML uttalelser med en enkelt uttalelse. Dette kan forbedre spørringsytelsen fordi operasjonene utføres i en enkelt setning, og dermed minimere antall ganger dataene i kilden og måltabellene blir behandlet. Prestasjonsgevinster avhenger imidlertid av å ha riktige indekser, sammenføyninger og andre hensyn på plass.

Indeksens beste fremgangsmåter

For å forbedre ytelsen til MERGE-setningen anbefaler vi følgende indeksretningslinjer :

  • Opprett en indeks på tilknytningskolonnene i kildetabellen som er unik og dekker.
  • Opprett en unik gruppert indeks på sammenføyningskolonnene i måltabellen.

Disse indeksene sørger for at sammenkoblingsnøklene er unike og at dataene i tabellene er sortert. Søkeytelsen forbedres fordi spørreoptimalisereren ikke trenger å utføre ekstra valideringsbehandling for å finne og oppdatere dupliserte rader, og det er ikke nødvendig med flere sorteringsoperasjoner.

BLI MED Beste fremgangsmåter

For å forbedre ytelsen til MERGE-setningen og sikre at riktige resultater oppnås, anbefaler vi følgende retningslinjer for sammenføyning:

  • Spesifiser bare søkebetingelser i PÅ < merge_search_condition > klausul som bestemmer kriteriene for samsvarende data i kilde- og måltabellene. Det vil si at du bare spesifiserer kolonner fra måltabellen som sammenlignes med de tilsvarende kolonnene i kildetabellen.
  • Ikke inkluder sammenligninger med andre verdier, for eksempel en konstant.

For å filtrere ut rader fra kilde- eller måltabellene, bruk en av følgende metoder.

  • Angi søketilstanden for radfiltrering i riktig NÅR-ledd. For eksempel, NÅR IKKE MATCHES OG S.EmployeeName LIKE «S%» SETS INN …
  • Definer en visning på kilden eller målet som returnerer de filtrerte radene og refererer til visningen som kilden eller målet bord. Hvis visningen er definert på måltabellen, må eventuelle handlinger mot den tilfredsstille vilkårene for oppdatering av visninger. For mer informasjon om oppdatering av data ved hjelp av en visning, se Endre data gjennom en visning.
  • Bruk WITH <common table expression> -satsen for å filtrere ut rader fra kilde- eller måltabellene. . Denne metoden ligner på å spesifisere flere søkekriterier i ON-setningen og kan gi feil resultater. Vi anbefaler at du unngår å bruke denne metoden eller tester grundig før du implementerer den.

Sammenføyningsoperasjonen i MERGE-setningen er optimalisert på samme måte som en sammenføyning i en SELECT-setning. Det vil si at når SQL Server-prosesser blir med, velger spørringsoptimalisereren den mest effektive metoden (av flere muligheter) for å behandle sammenføyningen. Når kilde og mål er av samme størrelse og indeksretningslinjene som er beskrevet tidligere, brukes på kilde- og måltabellene, er en sammenslåingsoperatør den mest effektive spørringsplanen. Dette er fordi begge tabellene skannes en gang, og det er ikke nødvendig å sortere dataene. Når kilden er mindre enn måltabellen, foretrekkes en nestet sløyfeoperatør.

Du kan tvinge bruken av en bestemt sammenføyning ved å spesifisere OPTION (<query_hint>) -satsen i MERGE-uttalelsen. Vi anbefaler at du ikke bruker hash-sammenkobling som et spørsmålstips for MERGE-setninger, fordi denne sammenkoblingstypen ikke bruker indekser.

Parameterisering Beste fremgangsmåter

Hvis en VELG, INSERT, OPPDATERING , eller DELETE-setningen kjøres uten parametere, kan SQL Server-spørringsoptimereren velge å parametere setningen internt. Dette betyr at alle bokstavelige verdier som er inneholdt i spørringen, erstattes av parametere. For eksempel kan setningen INSERT dbo.MyTable (Col1, Col2) VALUES (1, 10) implementeres internt som INSERT dbo.MyTable (Col1, Col2) VALUES (@ p1, @ p2). Denne prosessen, kalt enkel parameterisering, øker relasjonsmotorens evne til å matche nye SQL-setninger med eksisterende, tidligere kompilerte utførelsesplaner. Søkeytelse kan forbedres fordi frekvensen av spørresamlinger og rekompileringer er redusert. Spørreoptimereren bruker ikke den enkle parameteriseringsprosessen på MERGE-setninger. Derfor kan det hende at MERGE-setninger som inneholder bokstavelige verdier, ikke fungerer like bra som individuelle INSERT-, UPDATE- eller DELETE-setninger fordi en ny plan blir samlet hver gang MERGE-setningen utføres.

For å forbedre spørringsytelsen, anbefaler vi følgende parametreringsretningslinjer:

  • Parameteriser alle bokstavelige verdier i ON <merge_search_condition> -satsen og i WHEN klausuler i MERGE-uttalelsen. For eksempel kan du innlemme MERGE-setningen i en lagret prosedyre og erstatte bokstavverdiene med passende inndataparametere.
  • Hvis du ikke kan parametere setningen, lager du en planguide av typen TEMPLATE og spesifiser PARAMETERIZATION FORCED spørretips i planguiden.
  • Hvis MERGE-setninger kjøres ofte i databasen, bør du vurdere å sette PARAMETERIZATION-alternativet på database til FORCED. Vær forsiktig når du angir dette alternativet. PARAMETERIZATION -alternativet er en innstilling på databasenivå og påvirker hvordan alle spørsmål mot databasen behandles.

TOP-klausulens beste fremgangsmåter

I MERGE-setningen spesifiserer TOP-setningen antallet eller prosentandelen av rader som er berørt etter at kildetabellen og måltabellen er slått sammen, og etter at rader som ikke kvalifiserer for en innsats, oppdatering eller sletting, blir fjernet . TOP-leddet reduserer antall sammenføyde rader ytterligere til den angitte verdien, og innsettings-, oppdaterings- eller slettingshandlingene blir brukt på de gjenværende sammenføyde radene på en ikke-ordnet måte. Det vil si at det ikke er noen rekkefølge som radene fordeles på handlingene som er definert i NÅR-leddene. For eksempel påvirker 10 rader å spesifisere TOPP (10); av disse radene kan 7 oppdateres og 3 settes inn, eller 1 kan slettes, 5 oppdateres og 4 settes inn og så videre.

Det er vanlig å bruke TOP-setningen for å utføre språk for datamanipulering (DML ) operasjoner på et stort bord i grupper. Når du bruker TOP-setningen i MERGE-setningen for dette formålet, er det viktig å forstå følgende implikasjoner.

  • I / O-ytelse kan bli påvirket.

    MERGE-setningen utfører en fullstendig tabellskanning av både kilde- og måltabellene. Å dele operasjonen i grupper reduserer antall skriveoperasjoner som utføres per batch; Imidlertid vil hver batch utføre en fullstendig tabellskanning av kilde- og måltabellene. Den resulterende leseaktiviteten kan påvirke ytelsen til spørringen.

  • Feil resultater kan oppstå.

    Det er viktig å sikre at alle påfølgende grupper retter seg mot nye rader. eller uønsket oppførsel, slik som feil innføring av dupliserte rader i måltabellen, kan forekomme. Dette kan skje når kildetabellen inneholder en rad som ikke var i en målbatch, men som var i den totale måltabellen.

  • For å sikre riktige resultater:

    • Bruk PÅ-klausulen for å bestemme hvilke kilderader som påvirker eksisterende målrader og hvilke som er virkelig nye.
    • Bruk en tilleggsbetingelse i klausulen NÅR MATCHED bestemmer om målraden allerede er oppdatert et tidligere parti.

Fordi TOP-klausulen bare brukes etter at disse klausulene er brukt, setter hver kjøring enten en virkelig umatchet rad eller oppdaterer en eksisterende rad.

Bulk Load Best Practices

MERGE-setningen kan brukes til å effektivt laste data fra en kildedatafil til en måltabell ved å spesifisere OPENROWSET(BULK…) klausul som tabellkilde. Ved å gjøre dette behandles hele filen i en enkelt batch.

For å forbedre ytelsen til massesammenslåingsprosessen, anbefaler vi følgende retningslinjer:

  • Opprett en gruppert indeks på sammenføyningskolonnene i måltabellen.

  • Bruk ORDER- og UNIQUE-hintene i OPENROWSET(BULK…) -sparagrafen for å spesifisere hvordan kildedatafilen sorteres.

    Som standard antar bulkoperasjonen at datafilen ikke er ordnet. Derfor er det viktig at kildedataene sorteres i henhold til den klyngede indeksen på måltabellen, og at ORDET-hintet brukes til å indikere rekkefølgen slik at spørringsoptimalisereren kan generere en mer effektiv spørringsplan. Tips valideres ved kjøretid; Hvis datastrømmen ikke er i samsvar med de angitte tipsene, blir det reist en feil.

Disse retningslinjene sikrer at sammenkoblingsnøklene er unike og sorteringsrekkefølgen for dataene i kildefilen samsvarer med måltabellen. Spørreytelse forbedres fordi ytterligere sorteringsoperasjoner ikke er nødvendige og unødvendige datakopier ikke er nødvendige.

Måling og diagnostisering av MERGE Performance

Følgende funksjoner er tilgjengelige for å hjelpe deg med å måle og diagnostisere ytelsen til MERGE-setninger.

  • Bruk flettstmt-telleren i sys.dm_exec_query_optimizer_info dynamisk styringsvisning for å returnere antall spørringsoptimaliseringer som er for MERGE-setninger.
  • Bruk attributtet merge_action_type i sys.dm_exec_plan_attributes dynamisk administrasjonsvisning for å returnere typen utføringsplan som ble brukt som resultat av en MERGE-setning.
  • Bruk SQL Trace til å samle feilsøkingsdata for MERGE-setningen på samme måte du ville ha for andre DML-utsagn (Data Manipulation Language). For mer informasjon, se SQL Trace.

Eksempler

A. Bruke MERGE for å utføre INSERT- og UPDATE-operasjoner på en tabell i en enkelt setning

Et vanlig scenario er å oppdatere en eller flere kolonner i en tabell hvis det finnes en samsvarende rad. Eller å sette inn dataene som en ny rad hvis en samsvarende rad ikke eksisterer. Du gjør vanligvis begge scenariene ved å sende parametere til en lagret prosedyre som inneholder de aktuelle UPDATE- og INSERT-setningene. Med MERGE-setningen kan du gjøre begge oppgavene i en enkelt setning. Følgende eksempel viser en lagret prosedyre i AdventureWorks2012database som inneholder både en INSERT-setning og en UPDATE-setning. Prosedyren blir deretter modifisert for å kjøre tilsvarende operasjoner ved å bruke en enkelt MERGE-setning.

B Bruke MERGE for å utføre OPPDATERING og SLETTE operasjoner på en tabell i en enkelt setning

Følgende eksempel bruker MERGE for å oppdatere ProductInventory tabellen i eksempeldatabasen AdventureWorks2012, daglig, basert på bestillinger som behandles i SalesOrderDetail -tabellen. Quantity -kolonnen i ProductInventory -tabellen oppdateres ved å trekke antall bestillinger hver dag for hvert produkt i SalesOrderDetail tabell. Hvis antall ordrer for et produkt faller lagernivået til et produkt til 0 eller mindre, blir raden for det produktet slettet fra ProductInventory -tabellen.

C. Bruke MERGE for å utføre OPPDATERING og INSERT-operasjoner på en måltabell ved å bruke en avledet kildetabell

Følgende eksempel bruker MERGE for å endre SalesReason -tabellen i AdventureWorks2012-databasen enten ved å oppdatere eller sette inn rader. Når verdien av NewName i kildetabellen samsvarer med en verdi i Name -kolonnen i måltabellen, (SalesReason), blir ReasonType -kolonnen oppdatert i måltabellen. Når verdien av NewName ikke stemmer overens, settes kilderaden inn i måltabellen. Kildetabellen er en avledet tabell som bruker Transact-SQL-tabellverdikonstruktøren til å spesifisere flere rader for kildetabellen. For mer informasjon om bruk av tabellverdikonstruktøren i en avledet tabell, se Tabellverdikonstruktør (Transact-SQL). Eksemplet viser også hvordan du lagrer resultatene av OUTPUT-setningen i en tabellvariabel. Og, deretter oppsummerer du resultatene av MERGE-setningen ved å kjøre en enkel select-operasjon som returnerer antallet innsatte og oppdaterte rader.

D.Sette inn resultatene av MERGE-setningen i en annen tabell

Følgende eksempel fanger opp data som er returnert fra OUTPUT-setningen i en MERGE-setning og setter inn dataene i en annen tabell. MERGE-setningen oppdaterer Quantity -kolonnen i ProductInventory -tabellen i AdventureWorks2012-databasen, basert på ordrer som behandles i SalesOrderDetail tabell. Eksemplet fanger opp de oppdaterte radene og setter dem inn i en annen tabell som brukes til å spore beholdningsendringer.

E. Bruk MERGE for å gjøre INSERT eller UPDATE på en målkanttabell i en grafdatabase

I dette eksemplet oppretter du nodetabeller Person og City og en kanttabell livesIn. Du bruker MERGE-setningen på livesIn kanten og setter inn en ny rad hvis kanten ikke allerede eksisterer mellom en Person og City. Hvis kanten allerede eksisterer, oppdaterer du bare StreetAddress-attributtet på livesIn kanten.

Se også

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *