Busca LIKE: texto literal, curingas e índices
Crie buscas literais parametrizadas, escape curingas e diferencie prefixo, substring e pesquisa de texto completo.
Quem busca um código com sublinhado normalmente espera esse caractere, não qualquer caractere. Parametrizar impede que a entrada vire sintaxe SQL, mas não remove curingas de LIKE. Construção segura e significado correto são responsabilidades separadas.
Separar texto de padrão
Para prefixo literal, escape primeiro o caractere de escape escolhido, depois porcentagem, sublinhado e colchete inicial. Acrescente finalmente o curinga desejado pela aplicação. Escapar o caractere escolhido por último também modificaria os escapes inseridos anteriormente.
CREATE TABLE #Names(Name nvarchar(100) NOT NULL);
INSERT #Names VALUES(N'A_% report'),(N'ABC report'),(N'A! report');
DECLARE @input nvarchar(100)=N'A_%';
DECLARE @pattern nvarchar(201);
SET @pattern=REPLACE(@input,N'!',N'!!');
SET @pattern=REPLACE(@pattern,N'%',N'!%');
SET @pattern=REPLACE(@pattern,N'_',N'!_');
SET @pattern=REPLACE(@pattern,N'[',N'![')+N'%';
SELECT Name FROM #Names
WHERE Name LIKE @pattern ESCAPE N'!'
ORDER BY Name;
O exemplo procura nomes começando literalmente por A_%. A_% report deve corresponder, ABC report não. A exclamação funciona como escape. Uma exclamação digitada pelo usuário é duplicada antes das demais transformações e permanece literal.
A entrada é limitada, enquanto o padrão permite expansão. O escape pode dobrar caracteres, e o sufixo acrescenta outro. Dimensione também o parâmetro do cliente. Truncamento pode remover um escape ou curinga e alterar resultados. Alinhe o tipo do parâmetro à coluna pesquisada.
Relacionar semântica e índice
Um prefixo ABC% frequentemente pode delimitar uma faixa no índice. Um curinga inicial como %ABC% normalmente não oferece o mesmo ponto de partida em um índice convencional. TOP limita linhas devolvidas, não necessariamente examinadas, sobretudo com correspondências raras ou ordenação adicional.
Maiúsculas e acentos dependem da collation. Defina se cafe e café são equivalentes antes de normalizar. Aplicar UPPER a cada valor indexado pode dificultar o acesso. Um contrato consistente é mais sustentável que transformações espalhadas em consultas.
Espaços também exigem política. Um parâmetro char fixo pode introduzir preenchimento; remover espaços pode modificar um código intencional. Teste tipos reais e collation utilizada, não apenas uma constante colada no SSMS.
Manter a API previsível
Um prefixo vazio vira correspondência universal após acrescentar o sufixo. Rejeite, exija tamanho mínimo ou ofereça navegação limitada. Aplique autorização antes de devolver linhas e ordenação estável com desempate único para paginação.
Full-text ajuda com palavras e linguagem, mas não substitui qualquer substring de códigos. Tokenização, idioma e pontuação afetam os resultados. Busca por sufixo pode justificar um índice mantido sobre strings invertidas, com seus próprios custos de atualização.
Prepare dados com porcentagem, sublinhado, colchetes, escape, acentos, espaços e ausência de resultado. Compare identificadores esperados, não apenas quantidades. Depois meça prefixos comuns e raros com volume realista, observando duração e leituras lógicas.
Preserve parametrização depois do escape. Escapar LIKE resolve interpretação do padrão, não injeção. Valide comprimento na API para evitar truncamentos diferentes entre aplicação e banco. Inclua um termo composto somente de caracteres especiais e outro terminado no caractere de escape. Essas entradas revelam erros na ordem das substituições. Uma busca confiável mantém a entrada como dado e respeita o comportamento prometido ao usuário.
Se usuários puderem fornecer padrões reais, ofereça um modo separado e identificado. Não misture essa semântica com o campo literal padrão. Documente também quais curingas são aceitos e como escapar os próprios caracteres especiais nesse modo.
Referências técnicas: Microsoft Learn: LIKE · Microsoft Learn: Collation.