Как избежать строки для использования с оператором LIKE в SQL Server?

Я ищу что-то, что работает в 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 ответов

Решение

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

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

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

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

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

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

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

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

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

ОБНОВИТЬ

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

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

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

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

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

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

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

Из документов:

Синтаксис

match_expression [NOT] LIKE шаблон [ESCAPE escape_character ]

Использовать ESCAPE вариант вот так:

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

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

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

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

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

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

Другие вопросы по тегам