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