Búsquedas LIKE: texto literal, comodines e índices
Construya búsquedas literales parametrizadas, escape comodines y distinga prefijos, subcadenas y búsqueda de texto completo.
Quien busca un código con guion bajo suele esperar ese carácter, no cualquier carácter. Parametrizar impide convertir la entrada en sintaxis SQL, pero no elimina los comodines de LIKE. Construcción segura y significado correcto son responsabilidades distintas.
Separar texto de patrón
Para un prefijo literal, escape primero el carácter de escape elegido, después porcentaje, guion bajo y corchete inicial. Añada finalmente el comodín que la aplicación desea. Escapar el carácter elegido al final modificaría también los escapes introducidos previamente.
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;
El ejemplo busca nombres que comienzan literalmente por A_%. Debe coincidir A_% report, no ABC report. La exclamación actúa como escape. Una exclamación introducida por el usuario se duplica antes de las demás transformaciones y conserva su significado literal.
La entrada está limitada, mientras el patrón admite expansión. El escape puede duplicar caracteres y el sufijo añade otro. Dimensione también el parámetro del cliente. Un truncamiento puede quitar un escape o comodín y alterar resultados. Alinee el tipo del parámetro con la columna buscada.
Relacionar semántica e índice
Un prefijo ABC% puede aprovechar un rango del índice. Un comodín inicial como %ABC% normalmente no ofrece el mismo punto de inicio en un índice convencional. TOP limita filas devueltas, no necesariamente examinadas, especialmente con coincidencias raras u ordenación adicional.
Mayúsculas y acentos dependen de la intercalación. Defina si cafe y café son equivalentes antes de normalizar. Aplicar UPPER sobre cada valor indexado puede dificultar el acceso. Un contrato consistente resulta más mantenible que transformaciones dispersas por consultas.
Los espacios también necesitan política. Un parámetro char fijo puede introducir relleno; recortar puede modificar un código intencional. Pruebe tipos reales e intercalación utilizada, no solo una constante pegada en SSMS.
Mantener predecible la API
Un prefijo vacío se convierte en coincidencia universal al añadir el sufijo. Rechácelo, exija longitud mínima o ofrezca navegación limitada. Aplique autorización antes de devolver filas y orden estable con desempate único para paginar.
Texto completo ayuda con palabras y lenguaje, pero no reemplaza cualquier subcadena de códigos. Tokenización, idioma y puntuación afectan resultados. Buscar sufijos puede justificar un índice mantenido sobre cadenas invertidas, con costes propios de actualización.
Prepare datos con porcentajes, guiones bajos, corchetes, escape, acentos, espacios y ausencia de coincidencia. Compare identificadores esperados, no solo cantidades. Después mida prefijos frecuentes y raros con volumen realista, observando duración y lecturas lógicas.
Mantenga parametrización después del escape. Escapar LIKE resuelve interpretación del patrón, no inyección. Valide longitud en la API para evitar truncamientos diferentes entre aplicación y base. Incluya un término formado únicamente por signos especiales y otro terminado en el carácter de escape. Esas entradas muestran errores de orden en los reemplazos. Una búsqueda fiable conserva entrada como datos y cumple las reglas prometidas al usuario.
Si permite patrones escritos por usuarios, ofrezca un modo separado y claramente identificado. No mezcle esa semántica con la búsqueda literal predeterminada.
Referencias técnicas: Microsoft Learn: LIKE · Microsoft Learn: Collation.