Échapper à une chaîne de caractères dans SQL Server de sorte qu'il est sûr à utiliser COMME expression
Comment échapper à une chaîne de caractères dans SQL Server stockées procédure de sorte qu'il est sûr à utiliser dans LIKE
expression.
Supposons que j'ai un NVARCHAR
variable comme ceci:
declare @myString NVARCHAR(100);
Et je veux l'utiliser dans un LIKE
expression:
... WHERE ... LIKE '%' + @myString + '%';
Comment puis-je échapper à la chaîne (plus précisément, les personnages qui sont significatifs pour les LIKE
la correspondance de modèle, par exemple %
ou ?
) en T-SQL, de sorte qu'il est sûr à utiliser de cette manière?
Par exemple, étant donné:
@myString = 'aa%bb'
Je veux:
WHERE ... LIKE '%' + @somehowEscapedMyString + '%'
pour correspondre à 'aa%bb'
, 'caa%bbc'
mais pas 'aaxbb'
ou 'caaxbb'
.
- Vous n'avez pas mis votre langage de programmation
- Son langage de programmation est T-SQL.
Vous devez vous connecter pour publier un commentaire.
À échapper les caractères spéciaux dans une expression, vous préfixe avec un caractère d'échappement. Vous obtenez de choisir qui échappent char à utiliser avec la fuite de mot-clé. (MSDN Ref)
Par exemple, s'échappe le symbole%, à l'aide de \ comme l'escape char:
Si vous ne savez pas ce que les personnages seront dans votre chaîne, et vous ne voulez pas de les traiter comme des caractères génériques, vous pouvez préfixer tous les caractères génériques avec un escape char, par exemple:
(Notez que vous devez vous échapper de votre escape char trop, et assurez-vous que l'intérieur
replace
de sorte que vous n'échappent pas à l'ajouter de l'autrereplace
consolidés). Ensuite, vous pouvez utiliser quelque chose comme ceci:Souviens aussi d'allouer plus d'espace pour votre @myString variable car il sera de plus avec la chaîne de remplacement.
\'
).'
pour l'application de l', car ce n'est pas un caractère spécial pour COMME. Par exemple, cela fonctionne très bien:declare @s nvarchar(max); set @s = '%''%'; with a_cte as ( select 'I''m adam' as aColumn ) select * from a_cte where aColumn like @s;
'
afin de définir une apostrophe dans une chaîne de caractères constante. Oui, vous avez besoin de le faire, mais le résultat de la chaîne de valeur n'a qu'une seule citation: l'échappement est fait juste pour obtenir le devis unique dans la variable de chaîne lors de la déclaration comme une valeur constante. Vous pouvez sélectionner le'
de quelque part, et n'aurait pas besoin d'y échapper.print @myString
de ma réponse vous verrez des valeurs comme15\% off
mais si vousprint @s
de mon précédent commentaire, il suffit de regarder comme%'%
, c'est à dire un seul devis.A eu un problème similaire (à l'aide de NHibernate, si la fuite mot-clé aurait été très difficile) et résolu à l'aide du support de caractères. Si votre échantillon deviendrait
Si vous avez besoin de preuves:
Plutôt que de s'échapper tous caractères dans une chaîne de caractères qui ont une signification particulière dans la syntaxe des motifs, étant donné que vous utilisez l'un des principaux générique dans le modèle, il est plus rapide et plus facile à faire.
Dans le cas où vous n'êtes pas en utilisant l'un des principaux générique de l'approche ci-dessus doit être évitée cependant, comme il ne peut pas utiliser un index sur
YourColumn
.En outre, dans les cas où le plan d'exécution optimal varie en fonction du nombre de lignes correspondantes les estimations peuvent être mieux lors de l'utilisation de
LIKE
avec le crochet s'échapper de la syntaxe, comparativement à les deuxCHARINDEX
et leESCAPE
mot clé.=
à la place. L'échappement des caractères spéciaux réponses pourraient encore être utiles pour une requête à la recherche pour les valeurs de départ avec une valeur particulière même si, commeLIKE
peut utiliser un index dans ce cas, maisCHARINDEX
ne le peuvent pas.Vous spécifiez le caractère d'échappement. La Documentation ici:
http://msdn.microsoft.com/en-us/library/ms179859.aspx
Voulez-vous rechercher pour les chaînes qui comprennent un caractère d'échappement? Par exemple, vous souhaitez que cette:
Où vous souhaitez rechercher tous les champs avec 10%? Si c'est le cas, alors vous pouvez utiliser la clause de sauvegarde pour spécifier un caractère d'échappement et d'échapper le caractère générique.