I svar, du har linket til i kommentarerne
, som jeg forhåbentlig har gjort det klart, misbruger vi FLET
erklæring.
Den forespørgsel, du har vist her, kunne trivielt erstattes af:
insert into T(Col1) select Col1 from T where ID = 123
Men hvis du ønsker at kunne tilføje en OUTPUT klausul
, og den OUTPUT
klausul skal referere til både de nyligt indsatte data og data fra kildetabellen, har du ikke tilladelse til at skrive en sådan klausul på en INSERT
erklæring.
Så vi bruger i stedet en MERGE
erklæring, men ikke til dets tilsigtede formål. Hele formålet er at tvinge den til at udføre en INSERT
og skriv vores OUTPUT
klausul.
Hvis vi undersøger dokumentationen for FLET
, ser vi, at den eneste klausul, hvor vi kan specificere at udføre en INSERT
er i NÅR IKKE MATCHED [BY MÅL]
klausul - i både WHEN MATCHED
og NÅR IKKE MATCHES EFTER KILDE
klausuler, er vores eneste muligheder at OPDATERE
eller SLET
.
Så vi er nødt til at skrive MERGE
sådan, at matchning altid mislykkes - og den enkleste måde at gøre det på er at sige, at matchning skal ske, når 1 =0
- hvilket forhåbentlig aldrig er.
Da SQL Server ikke understøtter boolean literals