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