I svar som du har länkat till i kommentarerna
, som jag förhoppningsvis har klargjort, vi missbrukar MERGE
uttalande.
Frågan du har visat här kan trivialt ersättas av:
insert into T(Col1) select Col1 from T where ID = 123
Men om du vill kunna lägga till en OUTPUT klausul
, och den OUTPUT
klausulen måste referera till både nyinfogade data och data från källtabellen får du inte skriva en sådan sats på en INSERT
uttalande.
Så vi använder istället en MERGE
uttalande, men inte för dess avsedda syfte. Hela syftet är att tvinga den att utföra en INSERT
och skriv vår OUTPUT
klausul.
Om vi granskar dokumentationen för SAMMANFATTNING
, ser vi att den enda satsen där vi kan specificera att utföra en INSERT
finns i NÄR INTE MATCHED [BY MÅL]
sats - i både WHEN MATCHED
och NÄR INTE MATCHAS EFTER KÄLLA
klausuler, våra enda alternativ är att UPPDATERA
eller DELETE
.
Så vi måste skriva MERGE
så att matchning alltid misslyckas - och det enklaste sättet att göra det är att säga att matchning ska ske när 1 =0
- vilket förhoppningsvis aldrig är det.
Eftersom SQL Server inte stöder boolean literals