Проблема с апострофом

У меня есть Proc, который был закодирован в Dynamic SQl для одного из моих приложений. Он используется для поиска соискателей по фамилии. Прямо сейчас он ищет кандидатов либо по первым 2 цифрам фамилии, либо по полной фамилии. Но у меня проблема с поиском кандидатов, в фамилии которых есть апостроф (например, О'Коннор). Если клиент попытается найти кандидата с помощью O' или O'Connor, он выдаст ошибку. Они хотят найти каждого кандидата с апострофом или без него в фамилии. Пожалуйста, помогите, я пробовал все, но это не работает. Ниже приведен мой поисковый код, который используется в Proc для отбора кандидатов:

При необходимости добавьте подстановочные знаки

if Rtrim(@FirstName) <> ''
begin 
  If(Len(@FirstName) < 30) and (CharIndex('%', @FirstName) = 0) and @FirstName != ''
         Set @FirstName = char(39) + @FirstName + '%' + char(39)
end 

if Rtrim(@LastName) <> ''
begin 
   If(Len(@LastName) < 60) and (CharIndex('%', @LastName) = 0) and @LastName != ''
     Set @LastName = Char(39) + @LastName + '%' + char(39)
end

Теперь строим динамически базу фильтра по входным параметрам.

if Rtrim(@LastName) <> ''
 select @Where = @Where + ' and a.LastName like '+ Rtrim(@LastName)

person user203671    schedule 07.11.2009    source источник


Ответы (2)


Вам нужно избежать апострофа во входной строке (в основном заменить один «два»), когда вы создаете свою строку SQL

Вам нужно обратить внимание на это везде, где вы решите передать пользовательский ввод в базу данных SQL-сервера, поскольку это проблема безопасности (атаки SQL-инъекций) c.f. Таблицы Бобби

if Rtrim(@LastName) <> ''
 select @Where = @Where + ' and a.LastName like '+ Replace(Rtrim(@LastName),'''','''''') + ''
person Murph    schedule 07.11.2009
comment
Я получаю следующую ошибку при выполнении Proc. Я печатаю оператор Select из Proc - я не могу поместить здесь весь оператор из-за ограничения - ниже показано, что он печатает для фамилии, например: Сервер: Msg 170, уровень 15, состояние 1, строка 1, строка 1: неправильный синтаксис рядом с буквой О. и a.LastName как ''O''REILLY%'' - person user203671; 07.11.2009
comment
Вы заменяете один апостроф на два апострофа? Похоже, вы заменяете его двойной кавычкой, что неправильно - person Murph; 07.11.2009
comment
Итак, вот что я получил, когда распечатал текущий код без добавления кода, который вы мне дали. Сервер: сообщение 170, уровень 15, состояние 1, строка 1, строка 1: неправильный синтаксис рядом с «REILLY». Сервер: сообщение 105, уровень 15, состояние 1, строка 1. Незакрытые кавычки перед строкой символов ''. и a.LastName как "O'REILLY%" - person user203671; 07.11.2009

Мое предложение состоит в том, чтобы написать запрос, содержащий альтернативный столбец, который будет использоваться для фильтрации с заменой апострофа/одинарной кавычки любым специальным символом, таким как #. Это позволяет вам оставить исходный столбец нетронутым на случай, если вы захотите его отобразить.

Чтобы сделать это в SQL Server, вы можете сделать что-то вроде этого:

Select
    tbl.strName_Last,
    REPLACE(tblOrder.strName_Last, '''','#')) as StrLastNameForFilter
  ....

Затем измените свой код для фильтрации на основе этого альтернативного столбца и в предоставленной пользователем строке фильтра замените апостроф/одинарную кавычку специальным символом.

person Daryl Nickerson    schedule 22.11.2011