Подтвердить что ты не робот

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

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

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 + '%')

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

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

4b9b3361

Ответ 1

Для поиска "%" как литерала, а не подстановочного символа в строке, ему нужно экранировать как [%].

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

UPDATE

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

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

WHERE [Name] LIKE @searchText ESCAPE '~'

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

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

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

Ответ 5

Я бы дезактивировал строку в интерфейсном приложении, а не пытался и делал hokey stuff в SQL, чтобы обойти это.

Ответ 6

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

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

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

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

Ответ 7

От документы:

Синтаксис

match_expression [NOT] LIKE pattern [ESCAPE escape_character]

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

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