Tenho uma tabela que armazena notas fiscais e estou tentando tirar estatísticas dela, infelizmente a tabela está mal construída e algumas informações cruciais estão todas misturadas em um campo nvarchar, informações como se a nota fiscal foi cancelada ou se parte da cobrança está isenta reside neste campo em uma string muito daliesca que é analisada pelo frontend.3453.234;exempt;Invoice Total...
Portanto, quero criar uma consulta que exclua algumas palavras. Meu problema é como realizar uma consulta que possa excluir registros dependendo de uma lista de palavras-chave (cancelado, isento), então se alguma dessas palavras estiver no campo o valor não seria levado em consideração.
Não é muito difícil criar uma consulta que faça isso. Primeiro, crie uma consulta que ingresse em uma tabela usando LIKE com curingas. Em seguida, exclua tudo desta consulta.
Para entender o que quero dizer, veja este exemplo simples: http://sqlfiddle.com/#!6/619fb/2
Ou, alternativamente, reproduzi um exemplo aqui:
O desempenho pode ser um problema se você tiver centenas de milhares de linhas. Sem mais informações, porém, seria difícil fornecer uma consulta de alto desempenho (por exemplo, usar uma consulta de texto livre NÃO CONTÉM pode oferecer melhor desempenho).
A pesquisa de texto completo é uma maneira mais avançada de indexar cadeias de caracteres complexas. Sei que seu caso não contém prosa, mas o FTS ainda pode funcionar para você.
Como alternativa à pesquisa curinga, você pode dividir seus valores concatenados em partes separadas. Existem muitas maneiras de conseguir isso; a leitura deste link o levará a um que seja adequado. Em seguida, você pode tratar seus dados de maneira definida. Isso pressupõe que as posições dentro do nvarchar sejam consistentes ou, pelo menos, bem definidas.
De qualquer forma, é provável que você termine com varreduras de tabela sempre que executar a consulta como a) o analisador não usará um índice se houver um curinga inicial no predicado ou b) você deve dividir os valores antes de poder filtrá-los .
Se você conseguir de alguma forma indexar uma exibição que inclua os valores divididos, isso pode funcionar adequadamente.