Recherche LIKE : texte littéral, jokers et index
Construisez une recherche littérale paramétrée, échappez les jokers et distinguez préfixe, sous-chaîne et recherche plein texte.
Un utilisateur recherchant un code avec un souligné attend généralement ce caractère, pas un caractère quelconque. La paramétrisation empêche l'entrée de devenir de la syntaxe SQL, mais ne retire pas les jokers de LIKE. Sécurité de construction et exactitude de recherche restent deux responsabilités.
Distinguer texte et motif
Pour un préfixe littéral, échappez d'abord le caractère d'échappement choisi, puis pourcentage, souligné et crochet ouvrant. Ajoutez enfin le joker final voulu par l'application. Échapper le caractère spécial en dernier modifierait aussi ceux introduits par les remplacements précédents.
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;
La recherche vise les noms commençant réellement par A_%. A_% report doit correspondre, pas ABC report. Le point d'exclamation sert d'échappement. Celui saisi par l'utilisateur est doublé avant les autres transformations et reste un caractère ordinaire.
La variable d'entrée est bornée ; celle du motif laisse de la place à l'expansion. L'échappement peut doubler la longueur, plus un caractère pour le suffixe. Dimensionnez également le paramètre client. Une troncature peut enlever un échappement ou le joker et changer les résultats. Alignez le type du paramètre sur la colonne recherchée.
Relier sémantique et index
Un préfixe ABC% peut souvent délimiter une plage d'index. Un joker initial comme %ABC% ne fournit généralement pas le même point de départ dans un index classique. TOP limite les lignes retournées, pas nécessairement les lignes examinées, surtout pour un motif rare ou un tri supplémentaire.
La collation détermine casse et accents. Décidez si cafe et café doivent être équivalents avant de normaliser. Appliquer UPPER à chaque valeur indexée peut compliquer l'accès. Un contrat cohérent de comparaison est plus facile à maintenir que des transformations dispersées.
Les espaces demandent aussi une règle. Un paramètre char fixe peut ajouter du remplissage, tandis que supprimer les espaces peut altérer un code intentionnel. Testez les véritables types et la collation utilisée, pas seulement une constante collée dans SSMS.
Rendre le service prévisible
Un préfixe vide devient un motif universel après ajout du suffixe. Rejetez-le, imposez une longueur minimale ou prévoyez un mode de consultation borné. Appliquez les droits avant de retourner les résultats et utilisez un ordre stable avec départage unique pour la pagination.
La recherche plein texte aide la recherche linguistique, mais ne remplace pas arbitrairement les sous-chaînes de codes. Découpage en mots, langue et ponctuation changent les résultats. Une recherche par suffixe peut justifier un index entretenu sur une chaîne inversée, avec son propre coût de mise à jour.
Testez pourcentages, soulignés, crochets, échappement, accents, espaces et absence de résultat. Vérifiez les identifiants attendus plutôt que seulement le nombre. Mesurez ensuite préfixes fréquents et rares avec un volume réaliste, en observant durée et lectures logiques.
Gardez la commande paramétrée après échappement. L'échappement LIKE traite l'interprétation du motif, pas l'injection. Vérifiez les entrées longues dès la frontière API pour éviter des troncatures différentes entre application et base. Le service fiable conserve l'entrée comme donnée tout en respectant les règles annoncées à l'utilisateur.
Références techniques: Microsoft Learn: LIKE · Microsoft Learn: Collation.