In risposta a cui ti sei collegato nei commenti
, come spero di aver chiarito, stiamo abusando il MERGE dichiarazione.
La query che hai mostrato qui potrebbe essere banalmente sostituita da:
insert into T(Col1) select Col1 from T where ID = 123
Tuttavia, se desideri essere in grado di aggiungere un OUTPUT clausola
e quel OUTPUT la clausola deve fare riferimento sia ai dati appena inseriti che dati dalla tabella di origine, non sei autorizzato a scrivere tale clausola su un INSERT dichiarazione.
Quindi, utilizziamo invece un MERGE dichiarazione, ma non per lo scopo previsto. L'intero scopo è forzarlo a eseguire un INSERT e scrivi il nostro OUTPUT clausola.
Se esaminiamo la documentazione per MERGE
, vediamo che l'unica clausola in cui possiamo specificare di eseguire un INSERT è nel WHEN NOT MATCHED [BY TARGET] clausola - in entrambi WHEN MATCHED e WHEN NOT MATCHED BY SOURCE clausole, le nostre uniche opzioni sono UPDATE o DELETE .
Quindi, dobbiamo scrivere MERGE in modo tale che la corrispondenza fallisca sempre - e il modo più semplice per farlo è dire che la corrispondenza dovrebbe verificarsi quando 1 = 0 - che, si spera, non è mai.
Poiché SQL Server non supporta letterali booleani