Как избежать строки для использования с оператором LIKE в SQL Server? - PullRequest
12 голосов
/ 15 сентября 2009

Я ищу что-то, что работает в SQL Server, подобно символу @ в c #, что приводит к тому, что строка воспринимается как буквальная. Например:

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

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

Обратите внимание, как символ @ воздействовал на строку, принимая каждый символ как есть.

Теперь я не уверен, что это возможно, но вот моя проблема, и, возможно, есть лучший способ решить эту проблему. Рассмотрим следующий основной запрос:

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

Моя проблема в том, если они вставят %, _ или любой другой из тех специальных символов, которые могут повлиять на мое предложение like. Я хочу, чтобы матч действовал так же, как функция «начинается с». Так что я могу обратиться к @searchText, чтобы сказать, воспринимать это буквально, или, возможно, есть лучшее решение, о котором я не думаю?

Редактировать: Я не хочу, чтобы решение заключалось в очистке на стороне клиента. Мне нужно, чтобы этот хранимый процесс работал, не полагаясь на данные, передаваемые при очистке.

Ответы [ 7 ]

18 голосов
/ 15 сентября 2009

Для поиска «%» как литерала, не подстановочного знака в строке, необходимо экранировать как [%].

Теперь для SQL Server требуется экранирование только 3 символов:% _ [

Итак, создайте скалярный udf, чтобы обернуть это:

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

Из-за простоты (очень ограниченной) сопоставления с образцом в SQL ничего более сложного не требуется ...

9 голосов
/ 15 сентября 2009

В TSQL вы можете заключить символы% и _ в квадратные скобки следующим образом: [%] [_] это говорит SQL, чтобы они воспринимались как литералы.

Я проверил и подтвердил, что это работает в SQL Server 7.0, 2000 и 2005.

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

0 голосов
/ 15 сентября 2009

С документы :

Синтаксис

match_expression [NOT] LIKE pattern [ESCAPE escape_character ]

Используйте опцию ESCAPE следующим образом:

SELECT [Name] 
  FROM [Test] 
 WHERE [Name] LIKE (REPLACE(@searchText, '%', '%%') + '%') ESCAPE '%'
0 голосов
/ 15 сентября 2009

Если вы параметризуете свой запрос, вам не нужно беспокоиться об этом.

UPDATE

Как говорится в комментариях о рекурсии,% по-прежнему необходимо экранировать даже в параметризованных запросах, я не осознавал, что linq to sql делал это автоматически, когда я тестировал.

Вы можете использовать ESCAPE 'x', где x - символ, который вы хотите использовать в качестве escape-символа. Linq to SQL делает это так

ГДЕ [Имя] НРАВИТСЯ @searchText ESCAPE '~'

где @searchText = [некоторый текст с ~ символом%%]

или, как говорили другие, его можно экранировать с помощью [%]

посмотреть документацию

0 голосов
/ 15 сентября 2009

Если вы не хотите изменять входящий текст, вы можете использовать функцию «ВЛЕВО», чтобы создать свой собственный «STARTSWITH»:

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

(Обратите внимание, что вам, вероятно, нужно проделать дополнительную работу, чтобы обработать регистр NULL или пустую строку.)

РЕДАКТИРОВАТЬ: Удалено неправильное утверждение об использовании "LIKE" для поиска "%".

0 голосов
/ 15 сентября 2009

Я бы санировал строку во внешнем приложении, а не пытался делать хитрые вещи в SQL, чтобы обойти это.

0 голосов
/ 15 сентября 2009

Каждый символ, который нужно рассматривать буквально, должен быть заключен в квадратные скобки. Правая скобка понимается буквально напрямую, поэтому не заключайте ее в скобки.

...