Dans le réponse à laquelle vous avez lié dans les commentaires
, comme j'espère l'avoir précisé, nous abusons le MERGE
déclaration.
La requête que vous avez montrée ici pourrait trivialement être remplacée par :
insert into T(Col1) select Col1 from T where ID = 123
Toutefois, si vous souhaitez pouvoir ajouter un OUTPUT
clause
, et que OUTPUT
la clause doit faire référence à la fois aux données nouvellement insérées et données de la table source, vous n'êtes pas autorisé à écrire une telle clause sur un INSERT
déclaration.
Donc, nous utilisons à la place un MERGE
déclaration, mais pas aux fins prévues. Le but est de le forcer à effectuer un INSERT
et écrivez notre OUTPUT
clause.
Si nous examinons la documentation de MERGE
, nous voyons que la seule clause dans laquelle nous pouvons spécifier d'effectuer un INSERT
est dans WHEN NOT MATCHED [BY TARGET]
clause - à la fois dans WHEN MATCHED
et WHEN NOT MATCHED BY SOURCE
clauses, nos seules options sont de UPDATE
ou DELETE
.
Donc, nous devons écrire le MERGE
de sorte que la correspondance échoue toujours - et la façon la plus simple de le faire est de dire que la correspondance doit se produire lorsque 1 = 0
- qui, espérons-le, n'est jamais.
Étant donné que SQL Server ne prend pas en charge les littéraux booléens