SQL Server na prática

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.

Pergunte sobre este artigo

Tem alguma dúvida sobre este tema?

Conte o que você está avaliando ou onde encontrou dificuldades. Responderemos com uma recomendação prática.

Inquiries are not enabled in this preview.

Fazer uma pergunta sobre este artigo