Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Por que preciso da parte 'match' de uma mesclagem SQL, neste cenário?


No resposta à qual você vinculou nos comentários , como espero ter deixado claro, estamos abusando o MERGE declaração.

A consulta que você mostrou aqui poderia ser substituída trivialmente por:
insert into T(Col1) select Col1 from T where ID = 123

No entanto, se você quiser adicionar uma OUTPUT cláusula , e que OUTPUT cláusula precisa referenciar os dados recém-inseridos e dados da tabela de origem, você não tem permissão para escrever tal cláusula em um INSERT declaração.

Então, em vez disso, usamos um MERGE declaração, mas não para o propósito pretendido. Todo o propósito é forçá-lo a executar um INSERT e escreva nosso OUTPUT cláusula.

Se examinarmos a documentação para MERGE , vemos que a única cláusula na qual podemos especificar para executar um INSERT está no WHEN NOT MATCHED [BY TARGET] cláusula - tanto no WHEN MATCHED e QUANDO NÃO CORRESPONDIDO PELA FONTE cláusulas, nossas únicas opções são UPDATE ou EXCLUIR .

Então, temos que escrever o MERGE tal que a correspondência sempre falha - e a maneira mais simples de fazer isso é dizer que a correspondência deve ocorrer quando 1 =0 - o que, espero, nunca é.

Como o SQL Server não oferece suporte a literais booleanos