Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Pourquoi ai-je besoin de la partie "correspondance" d'une fusion SQL, dans ce scénario ?

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