Точное совпадение с хранимой процедурой, используя LIKE в T-SQL? - PullRequest
0 голосов
/ 22 июня 2010

У меня есть хранимая процедура (SP) с использованием LIKE. Давайте упростим это: ВЫБРАТЬ * ОТ ПОКУПАТЕЛЕЙ, ГДЕ НАИМЕНОВАТЬ НРАВИТСЯ '%' + @query + '%' .

Я бы хотел использовать его для (необязательного) поиска точного соответствия без изменения хранимой процедуры, но с хитрым параметром;)

Есть ли способ "отменить" 2 '%' с помощью умного @ запроса ?

Ответы [ 4 ]

2 голосов
/ 22 июня 2010

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

Используя базовый ответ Винко, вы можете получить

create procedure match
    @needle varchar(max), @mode int
as
begin
declare @like char(1);

set @like = case when @like = 1 then '%' else '' end

SELECT * FROM customers WHERE name LIKE (@like + @needle + @like)
end

0 голосов
/ 22 июня 2010

Попробуйте:

select *
from customers
where case @exact then name = @query else name like '%' + @query + '%' end;
0 голосов
/ 22 июня 2010

Примечание: я бы никогда не рекомендовал это делать.Это признак того, что вы делаете это действительно очень неправильно.Сказав это, если вы действительно хотите сделать свою собственную SQL-инъекцию, и ваша хранимая процедура выглядит следующим образом:

set @query = 'SELECT * FROM tmpCustomer WHERE name LIKE ''%' + @needle + '%'''
exec (@query)

Затем запустите вашу хранимую процедуру следующим образом:

exec match '~~~~THIS WILL NEVER BE IN THE DATABASE~~~~'' OR name = ''testing'' OR ''notapercentagesign'' = '''

...should сделать поиск точного соответствия для «тестирования».

Но, честно говоря, если вам нужно сделать что-то подобное с вашей собственной компьютерной системой, то вы проиграли, и вот некоторые доказательства: запуск вашей хранимой процедурыкак this :

exec match '''; DELETE FROM Customer; SELECT * FROM Customer WHERE name LIKE '' '

... удалит все ваши записи клиентов:)

0 голосов
/ 22 июня 2010

Почему так должно быть? Нечто подобное имеет больше смысла (не проверено, возможно, есть ошибки / опечатки)

create procedure match
    @needle varchar(max), @mode int
as
begin
    declare @query varchar(max)
    if @mode = 1 begin
        set @query = 'SELECT * FROM customers WHERE name LIKE ''%' + @needle + '%'''
    end
    else begin
        set @query = 'SELECT * FROM customers WHERE name = ''' + @needle + '''
    end
    exec @query
end

РЕДАКТИРОВАТЬ: Поскольку вы хотите избежать изменения прототипа, вы можете смоделировать параметр режима или просто отправить строку с% s

create procedure match
    @modeneedle varchar(max)
as
begin
    declare @mode varchar(1)
    declare @needle varchar(max)

    set @mode=substring(@modeneedle,1,1)
    set @needle=substring(@modeneedle,2,len(@modeneedle))

    declare @query varchar(max)
    if @mode = '1' begin
        set @query = 'SELECT * FROM customers WHERE name LIKE ''%' + @needle + '%'''
    end
    else begin
        set @query = 'SELECT * FROM customers WHERE name = ''' + @needle + '''
    end
    exec @query
end
...