2009-11-07 3 views
0

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

Добавить символы при необходимости

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) 

ответ

3

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

Вы должны обратить внимание на это где угодно se, чтобы передать пользовательский ввод в базу данных SQL Server как проблему безопасности (SQL Injection Attacks) c.f. Bobby Tables

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

Я получаю ниже Ошибка при выполнении Proc. Я печатаю инструкцию Select из Proc - я не могу поставить здесь весь текст из-за ограничения - ниже это то, что он печатает для фамилии, например: Сервер: Msg 170, уровень 15, состояние 1, строка 1 Строка 1 : Неправильный синтаксис около 'O'. и a.LastName like '' O''REILLY% '' – user203671

+0

Вы заменяете один апостроф двумя апострофами? Похоже, вы заменяете его двойной цитатой - что не так. – Murph

+0

Итак, вот что я получил, когда я печатаю текущий код без добавления кода, который вы мне дали. Сервер: Msg 170, Level 15, State 1, Строка 1 Строка 1: Неправильный синтаксис рядом с «REILLY». Сервер: Msg 105, уровень 15, состояние 1, строка 1 Незакрытая кавычка перед символьной строкой ''. и a.LastName наподобие 'O'REILLY%' – user203671

0

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

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

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

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

Смежные вопросы