Question Comment échapper à une chaîne à utiliser avec l'opérateur LIKE dans SQL Server?


Je cherche quelque chose qui fonctionne dans SQL Server similaire à la @ symbole dans c # qui fait qu'une chaîne est prise comme littérale. Par exemple:

string text = "abcd\\efg";
Output of text = abcd\efg

string text = @"abcd\\efg";
Output of text = abcd\\efg

Notez comment le @ affecte la chaîne pour prendre chaque caractère tel quel.

Maintenant, je ne suis pas sûr que ce soit possible, mais voici mon problème et il y a peut-être une meilleure façon de résoudre ce problème. Considérez la requête de base suivante:

SELECT [Name] 
  FROM [Test] 
 WHERE [Name] LIKE (@searchText + '%')

Mon problème est si ils mettent un %, _ ou tout autre caractère spécial pouvant affecter ma clause similaire. Je veux que le match agisse comme une fonction «commence par». Donc, y a-t-il quelque chose que je puisse appliquer à @searchText pour dire que prendre cela littéralement ou existe-t-il une meilleure solution à laquelle je ne pense pas?

Modifier: Je ne veux pas que la solution soit le nettoyage côté client. J'ai besoin que cette procédure stockée fonctionne sans dépendre du nettoyage des données transmises.


12
2017-09-15 16:24


origine


Réponses:


Pour rechercher "%" comme un littéral non générique dans une chaîne, il doit être échappé sous la forme [%].

Désormais, SQL Server ne nécessite que 3 caractères:% _ [

Donc, créez un udf scalaire pour envelopper ceci:

REPLACE(REPLACE(REPLACE(@myString, '[', '[[]'), '_', '[_]'), '%', '[%]')

En raison de la simplicité (aka: très limitée) de la correspondance de modèles dans SQL, rien de plus complexe n'est nécessaire ...


17
2017-09-15 17:21



Dans TSQL, vous pouvez envelopper les caractères% et _ entre parenthèses, ainsi [%] [_] indique à SQL de les traiter comme des littéraux.

J'ai testé et vérifié que cela fonctionne dans SQL Server 7.0, 2000 et 2005.

http://msdn.microsoft.com/en-us/library/aa933232(SQL.80).aspx


9
2017-09-15 16:34



Chaque caractère à traiter littéralement doit être placé entre crochets. Une parenthèse droite est prise littéralement directement, alors ne l'envoyez pas.


0
2017-09-15 16:29



Si vous paramétrez votre requête, vous n'avez pas à vous en préoccuper.

METTRE À JOUR

Comme récursif indiqué dans les commentaires,% doit encore être échappé même dans les requêtes paramétrées, je n'ai pas réalisé que linq to sql le faisait automatiquement lors de mes tests.

Vous pouvez utiliser ESCAPE 'x' où x est le caractère que vous souhaitez utiliser comme caractère d'échappement. Linq to SQL le fait comme ça

WHERE [Nom] LIKE @searchText ESCAPE '~'

où @searchText = [du texte avec un ~% caractère%]

ou comme d'autres l'ont déclaré, il peut être échappé avec [%]

afficher la documentation


0
2017-09-15 16:42



Je désinfecterais la chaîne dans l'application frontale plutôt que d'essayer de faire des choses hokey dans SQL pour contourner ce problème.


-1
2017-09-15 16:31



De les docs:

Syntaxe

match_expression [ PAS COMME modèle   [ ÉCHAPPER caractère d'échappement ]

Utilisez le ESCAPE option comme ça:

SELECT [Name] 
  FROM [Test] 
 WHERE [Name] LIKE (REPLACE(@searchText, '%', '%%') + '%') ESCAPE '%'

-1
2017-09-15 16:44



Si vous ne souhaitez pas modifier le texte entrant, vous pouvez utiliser la fonction "GAUCHE" pour créer votre propre "STARTSWITH":

SELECT [Name] 
  FROM [Test] 
 WHERE @searchText = LEFT( [Name], LEN( @searchText ) )

(Notez que vous devrez probablement faire un travail supplémentaire pour gérer la casse des NULL ou des chaînes vides.)

EDIT: Suppression de l'instruction incorrecte concernant l'utilisation de "LIKE" pour rechercher "%".


-1
2017-09-15 16:39