Temos uma tabela de clientes (quem não tem?), contendo muitos registros que são, do ponto de vista comercial, duplicados. Consegui criar um pacote SSIS para executar o agrupamento difuso e relatar possíveis duplicatas.
Agora, suponha que eu queira fazer esse tipo de análise no momento em que alguém está entrando em um novo cliente. A ideia seria realizar uma pesquisa difusa no nome do cliente (e possivelmente alguma outra informação básica, como código postal) e mostrar possíveis duplicatas antes de prosseguir para o formulário de criação do cliente.
O problema óbvio aqui é que o agrupamento difuso e os componentes de pesquisa fazem parte do SSIS. Se eu quisesse executá-los sob demanda, teria que fazer algo insano como colocar os termos de pesquisa em uma tabela de preparação, executar o pacote SSIS, aguardar sua conclusão e buscar os resultados de uma tabela de saída. Seria lento, doloroso e teria graves problemas de simultaneidade.
Então, a outra ideia era usar a indexação de texto completo. Ao experimentá-lo, parece que não será adequado. Ele não detecta erros ortográficos sutis de nomes de clientes ou nomes que diferem em "Empresa" x "Corporação" x "Sociedade", ou "Anderson" x "Andersen" e outras variações desse tipo.
Existe algo que permitirá a flexibilidade do agrupamento/correspondência difusa do T-SQL? Posso dizer a uma pesquisa difusa para salvar os tokens, mas parece que ainda teria que reimplementar a maior parte do algoritmo de correspondência para usá-los.
No passado, construí uma "pesquisa difusa" em uma função .Net CLR. Essa função é chamada da mesma forma que uma função definida pelo usuário é chamada.
Por exemplo,
retornaria apenas clientes com um nome 80% semelhante ao nome de entrada.
A % de correspondência é baseada no número de alterações necessárias para converter um valor em outro, não no número de caracteres diferentes. Nós o usamos para comparar endereços e descobrimos que isso é mais eficaz devido às inúmeras abreviações de ruas usadas.
Aqui está o código que usei para comparar strings. Eu fiz isso há tanto tempo que não consigo lembrar como implantá-lo, embora uma pesquisa rápida mostre muitos artigos sobre como criar funções SQL CLR